From a6a541b903875f5b2f6d37db1ee2b6eb65186a5a Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 8 Nov 2023 12:57:33 +0300 Subject: [PATCH 01/31] Lab Orders CR implementation contd. --- lib/config/localized_values.dart | 1 + lib/core/model/labs/patient_lab_orders.dart | 20 +++++++++---- .../medical/labs/laboratory_result_page.dart | 1 + lib/pages/medical/labs/labs_home_page.dart | 3 ++ lib/uitl/translations_delegate_base.dart | 1 + lib/uitl/utils.dart | 30 +++++++++++++++++++ .../medical/LabResult/LabResultWidget.dart | 5 ++-- .../LabResult/laboratory_result_widget.dart | 5 ++-- .../data_display/medical/doctor_card.dart | 27 ++++++++++++++++- lib/widgets/my_rich_text.dart | 6 ++-- 10 files changed, 86 insertions(+), 13 deletions(-) diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 63619f59..23f95d05 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1901,4 +1901,5 @@ const Map localizedValues = { "habibCallCenter": {"en": "Please contact AlHabib call center to update your insurance manually.", "ar": "يرجى الاتصال بمركز اتصال الحبيب لتحديث التأمين الخاص بك يدوياً."}, "cashAmountUpdateInsurance": {"en": "Please note that this is the cash amount, If you want to update your insurance, Please tap below:", "ar": "يرجى ملاحظة أن هذا هو المبلغ النقدي، إذا كنت ترغب في تحديث التأمين الخاص بك، يرجى النقر أدناه:"}, "validInsurance": {"en": "Do you have a valid insurance?", "ar": "هل لديك تأمين صالح؟"}, + "resultStatus": {"en": "Result Status: ", "ar": "حالة النتيجة: "}, }; \ No newline at end of file diff --git a/lib/core/model/labs/patient_lab_orders.dart b/lib/core/model/labs/patient_lab_orders.dart index c2908023..2a5fcb8a 100644 --- a/lib/core/model/labs/patient_lab_orders.dart +++ b/lib/core/model/labs/patient_lab_orders.dart @@ -36,6 +36,9 @@ class PatientLabOrders { String setupID; List speciality; bool isLiveCareAppointment; + int status; + String statusDesc; + PatientLabOrders( {this.actualDoctorRate, this.clinicDescription, @@ -69,8 +72,11 @@ class PatientLabOrders { this.projectNameN, this.qR, this.setupID, - this.invoiceNo_VP, - this.speciality,this.isLiveCareAppointment}); + this.invoiceNo_VP, + this.speciality, + this.isLiveCareAppointment, + this.status, + this.statusDesc}); PatientLabOrders.fromJson(Map json) { actualDoctorRate = json['ActualDoctorRate']; @@ -107,7 +113,8 @@ class PatientLabOrders { setupID = json['SetupID']; invoiceNo_VP = json['invoiceNo_VP']; isLiveCareAppointment = json['IsLiveCareAppointment']; - // speciality = json['Speciality'].cast(); + status = json['Status']; + statusDesc = json['StatusDesc']; } Map toJson() { @@ -146,7 +153,9 @@ class PatientLabOrders { data['SetupID'] = this.setupID; data['Speciality'] = this.speciality; data['IsLiveCareAppointment'] = this.isLiveCareAppointment; - data['invoiceNo_VP'] =this.invoiceNo_VP; + data['invoiceNo_VP'] = this.invoiceNo_VP; + data['Status'] = this.status; + data['StatusDesc'] = this.statusDesc; return data; } } @@ -155,8 +164,7 @@ class PatientLabOrdersList { String filterName = ""; List patientLabOrdersList = List(); - PatientLabOrdersList( - {this.filterName, PatientLabOrders patientDoctorAppointment}) { + PatientLabOrdersList({this.filterName, PatientLabOrders patientDoctorAppointment}) { patientLabOrdersList.add(patientDoctorAppointment); } } diff --git a/lib/pages/medical/labs/laboratory_result_page.dart b/lib/pages/medical/labs/laboratory_result_page.dart index d5bb9035..4051a153 100644 --- a/lib/pages/medical/labs/laboratory_result_page.dart +++ b/lib/pages/medical/labs/laboratory_result_page.dart @@ -66,6 +66,7 @@ class _LaboratoryResultPageState extends State { details: model.patientLabSpecialResult.isEmpty ? null : getSpecialResults(model), orderNo: widget.patientLabOrders.orderNo, patientLabOrder: widget.patientLabOrders, + projectName: widget.patientLabOrders.projectName, ), itemCount: 1, ), diff --git a/lib/pages/medical/labs/labs_home_page.dart b/lib/pages/medical/labs/labs_home_page.dart index 26738778..70f658e9 100644 --- a/lib/pages/medical/labs/labs_home_page.dart +++ b/lib/pages/medical/labs/labs_home_page.dart @@ -86,6 +86,9 @@ class LabsHomePage extends StatelessWidget { isLiveCareAppointment: labOrder.isLiveCareAppointment, date: labOrder.orderDate, isSortByClinic: _isSortByClinic, + isLabOrderResult: true, + resultStatus: labOrder.status, + resultStatusDesc: labOrder.statusDesc, //projectViewModel.isArabic ? DateUtil.getMonthDayYearDateFormattedAr(labOrder.orderDate) : DateUtil.getMonthDayYearDateFormatted(labOrder.orderDate), ); }, diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 7af2010a..91a09f0c 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -2910,6 +2910,7 @@ class TranslationBase { String get habibCallCenter => localizedValues["habibCallCenter"][locale.languageCode]; String get cashAmountUpdateInsurance => localizedValues["cashAmountUpdateInsurance"][locale.languageCode]; String get validInsurance => localizedValues["validInsurance"][locale.languageCode]; + String get resultStatus => localizedValues["resultStatus"][locale.languageCode]; } diff --git a/lib/uitl/utils.dart b/lib/uitl/utils.dart index a39029b8..c7f57f9d 100644 --- a/lib/uitl/utils.dart +++ b/lib/uitl/utils.dart @@ -775,6 +775,36 @@ class Utils { ); } + static Widget tableColumnValueWithFlowChart(String text, String flowChartText, {bool isLast = false, bool isCapitable = true, ProjectViewModel mProjectViewModel}) { + ProjectViewModel projectViewModel = mProjectViewModel ?? Provider.of(AppGlobal.context); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox(height: 12), + Text( + isCapitable && !projectViewModel.isArabic ? text.toLowerCase().capitalizeFirstofEach : text, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, color: Color(0xff575757), letterSpacing: -0.4, height: 16 / 10), + ), + SizedBox(height: 12), + AutoSizeText( + flowChartText, + maxLines: 1, + minFontSize: 6, + style: TextStyle(decoration: TextDecoration.underline, fontSize: 12, fontWeight: FontWeight.w600, color: Color(0xffD02127), letterSpacing: -0.48, height: 18 / 12), + ), + if (!isLast) + Divider( + height: 1, + color: Color(0xffEFEFEF), + thickness: 1, + ) + ], + ); + } + static Future isGoogleServicesAvailable() async { GooglePlayServicesAvailability availability = await GoogleApiAvailability.instance.checkGooglePlayServicesAvailability(); String status = availability.toString().split('.').last; diff --git a/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart b/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart index 9a974aef..f8a0a9cc 100644 --- a/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart +++ b/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart @@ -161,7 +161,7 @@ class LabResultWidget extends StatelessWidget { Utils.tableColumnTitle(TranslationBase.of(context).description, showDivider: false), Utils.tableColumnTitle(TranslationBase.of(context).value, showDivider: false), Utils.tableColumnTitle(TranslationBase.of(context).range, showDivider: false), - Utils.tableColumnTitle("", showDivider: false), + Utils.tableColumnTitle(TranslationBase.of(context).unit, showDivider: false), ], ), ); @@ -202,7 +202,8 @@ class LabResultWidget extends StatelessWidget { }, child: Padding( padding: EdgeInsets.only(left: !projectViewModel.isArabic ? 0 : 12, right: !projectViewModel.isArabic ? 12 : 0), - child: Utils.tableColumnValueWithUnderLine(TranslationBase.of(context).viewFlowChart, isLast: true, isCapitable: false), + // child: Utils.tableColumnValueWithUnderLine(TranslationBase.of(context).viewFlowChart, isLast: true, isCapitable: false), + child: Utils.tableColumnValueWithFlowChart(labResultList[i].uOM, TranslationBase.of(context).viewFlowChart, isLast: true, isCapitable: false), ), ) : Container(), diff --git a/lib/widgets/data_display/medical/LabResult/laboratory_result_widget.dart b/lib/widgets/data_display/medical/LabResult/laboratory_result_widget.dart index f08bc3dd..6241eb5c 100644 --- a/lib/widgets/data_display/medical/LabResult/laboratory_result_widget.dart +++ b/lib/widgets/data_display/medical/LabResult/laboratory_result_widget.dart @@ -19,9 +19,10 @@ class LaboratoryResultWidget extends StatefulWidget { final String billNo; final String details; final String orderNo; + final String projectName; final PatientLabOrders patientLabOrder; - const LaboratoryResultWidget({Key key, this.onTap, this.billNo, this.details, this.orderNo, this.patientLabOrder}) : super(key: key); + const LaboratoryResultWidget({Key key, this.onTap, this.billNo, this.details, this.orderNo, this.projectName, this.patientLabOrder}) : super(key: key); @override _LaboratoryResultWidgetState createState() => _LaboratoryResultWidgetState(); @@ -49,7 +50,7 @@ class _LaboratoryResultWidgetState extends State { widget.patientLabOrder.doctorImageURL, widget.patientLabOrder.speciality, widget.billNo, - widget.patientLabOrder.projectName, + widget.projectName, widget.patientLabOrder.orderDate, null, widget.patientLabOrder.nationalityFlagURL, diff --git a/lib/widgets/data_display/medical/doctor_card.dart b/lib/widgets/data_display/medical/doctor_card.dart index 12454335..9e4de615 100644 --- a/lib/widgets/data_display/medical/doctor_card.dart +++ b/lib/widgets/data_display/medical/doctor_card.dart @@ -1,5 +1,6 @@ import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/extensions/string_extensions.dart'; +import 'package:diplomaticquarterapp/theme/colors.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/utils.dart'; @@ -34,6 +35,9 @@ class DoctorCard extends StatelessWidget { final bool isSickLeave; final int sickLeaveStatus; final int projectID; + final bool isLabOrderResult; + final int resultStatus; + final String resultStatusDesc; DoctorCard( {this.name, @@ -54,7 +58,10 @@ class DoctorCard extends StatelessWidget { this.isParentAppointment = false, this.isSickLeave = false, this.sickLeaveStatus = 0, - this.projectID = 0}); + this.projectID = 0, + this.isLabOrderResult = false, + this.resultStatus, + this.resultStatusDesc}); ProjectViewModel projectViewModel; @@ -217,6 +224,8 @@ class DoctorCard extends StatelessWidget { ), ], ), + if (isLabOrderResult) + MyRichText(TranslationBase.of(context).resultStatus, resultStatusDesc ?? "", projectViewModel.isArabic, valueColor: getResultStatusColor(resultStatus)), ], ), ), @@ -252,6 +261,22 @@ class DoctorCard extends StatelessWidget { ); } + Color getResultStatusColor(int resultStatus) { + Color statusColor = Color(0xff2B353E); + + if (resultStatus == 17 || resultStatus == 16) { + statusColor = CustomColors.green; + } + if (resultStatus == 45) { + statusColor = CustomColors.orange; + } + if (resultStatus == 44) { + statusColor = CustomColors.accentColor; + } + + return statusColor; + } + String getStatusText(BuildContext context) { String statusText = ""; if (sickLeaveStatus == 1) { diff --git a/lib/widgets/my_rich_text.dart b/lib/widgets/my_rich_text.dart index c3d108c5..cf426db5 100644 --- a/lib/widgets/my_rich_text.dart +++ b/lib/widgets/my_rich_text.dart @@ -4,7 +4,9 @@ class MyRichText extends StatelessWidget { final String title; final String value; final bool isArabic; - MyRichText(this.title,this.value,this.isArabic,{Key key}) : super(key: key); + Color valueColor; + + MyRichText(this.title, this.value, this.isArabic, {this.valueColor}); @override Widget build(BuildContext context) { @@ -16,7 +18,7 @@ class MyRichText extends StatelessWidget { children: [ TextSpan( text: " $value", - style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, fontFamily: isArabic ? 'Cairo' : 'Poppins', color: Color(0xff2B353E), letterSpacing: -0.48, height: 18 / 12), + style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, fontFamily: isArabic ? 'Cairo' : 'Poppins', color: valueColor ?? Color(0xff2B353E), letterSpacing: -0.48, height: 18 / 12), ) ]), ); From 47ccf68b3ade64a39fa2acc078051bebc5ddfa11 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 8 Nov 2023 13:56:08 +0300 Subject: [PATCH 02/31] updates --- lib/config/config.dart | 4 ++-- lib/uitl/utils.dart | 3 ++- lib/widgets/charts/show_chart.dart | 10 +++++----- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index cf605410..0990ec82 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -20,8 +20,8 @@ var PACKAGES_ORDERS = '/api/orders'; var PACKAGES_ORDER_HISTORY = '/api/orders/items'; var PACKAGES_TAMARA_OPT = '/api/orders/paymentoptions/tamara'; // var BASE_URL = 'http://10.50.100.198:2018/'; - // var BASE_URL = 'https://uat.hmgwebservices.com/'; -var BASE_URL = 'https://hmgwebservices.com/'; + var BASE_URL = 'https://uat.hmgwebservices.com/'; +// var BASE_URL = 'https://hmgwebservices.com/'; // var BASE_URL = 'https://orash.cloudsolutions.com.sa/'; // var BASE_URL = 'https://vidauat.cloudsolutions.com.sa/'; // var BASE_URL = 'https://vidamergeuat.cloudsolutions.com.sa/'; diff --git a/lib/uitl/utils.dart b/lib/uitl/utils.dart index c7f57f9d..1f45290c 100644 --- a/lib/uitl/utils.dart +++ b/lib/uitl/utils.dart @@ -788,13 +788,14 @@ class Utils { overflow: TextOverflow.ellipsis, style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, color: Color(0xff575757), letterSpacing: -0.4, height: 16 / 10), ), - SizedBox(height: 12), + SizedBox(height: 8), AutoSizeText( flowChartText, maxLines: 1, minFontSize: 6, style: TextStyle(decoration: TextDecoration.underline, fontSize: 12, fontWeight: FontWeight.w600, color: Color(0xffD02127), letterSpacing: -0.48, height: 18 / 12), ), + SizedBox(height: 12), if (!isLast) Divider( height: 1, diff --git a/lib/widgets/charts/show_chart.dart b/lib/widgets/charts/show_chart.dart index 4d69cd84..c9872092 100644 --- a/lib/widgets/charts/show_chart.dart +++ b/lib/widgets/charts/show_chart.dart @@ -114,21 +114,21 @@ class ShowChart extends StatelessWidget { fontSize: 10, ), rotateAngle: -65, - margin: 22, + margin: 8, getTitles: (value) { if (isWeeklyOrMonthly) { return '${timeSeries[value.toInt()].time.day}/ ${timeSeries[value.toInt()].time.month}'; } else { if (timeSeries.length < 15) { if (timeSeries.length > value.toInt()) { - return '${timeSeries[value.toInt()].time.month}/ ${timeSeries[value.toInt()].time.year}'; + return '${timeSeries[value.toInt()].time.day}/${timeSeries[value.toInt()].time.month}/${timeSeries[value.toInt()].time.year.toString().substring(2,4)}'; } else return ''; } else { - if (value.toInt() == 0) return '${timeSeries[value.toInt()].time.month}/ ${timeSeries[value.toInt()].time.year}'; - if (value.toInt() == timeSeries.length - 1) return '${timeSeries[value.toInt()].time.month}/ ${timeSeries[value.toInt()].time.year}'; + if (value.toInt() == 0) return '${timeSeries[value.toInt()].time.day}/${timeSeries[value.toInt()].time.month}/${timeSeries[value.toInt()].time.year.toString().substring(2,4)}'; + if (value.toInt() == timeSeries.length - 1) return '${timeSeries[value.toInt()].time.day}/${timeSeries[value.toInt()].time.month}/${timeSeries[value.toInt()].time.year.toString().substring(2,4)}'; if (xAxixs.contains(value.toInt())) { - return '${timeSeries[value.toInt()].time.month}/ ${timeSeries[value.toInt()].time.year}'; + return '${timeSeries[value.toInt()].time.day}/${timeSeries[value.toInt()].time.month}/${timeSeries[value.toInt()].time.year.toString().substring(2,4)}'; } } return ''; From 7d2744d29cabe7a5b9f8c3792e58cd2108096f43 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 8 Nov 2023 16:04:28 +0300 Subject: [PATCH 03/31] Lab report CR implemented --- lib/uitl/utils.dart | 5 +++-- .../data_display/medical/LabResult/LabResultWidget.dart | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/uitl/utils.dart b/lib/uitl/utils.dart index 1f45290c..9067a4f6 100644 --- a/lib/uitl/utils.dart +++ b/lib/uitl/utils.dart @@ -37,6 +37,7 @@ import 'package:diplomaticquarterapp/pages/medical/reports/report_home_page.dart import 'package:diplomaticquarterapp/pages/medical/smart_watch_health_data/smart_watch_instructions.dart'; import 'package:diplomaticquarterapp/pages/medical/vital_sign/vital_sign_details_screen.dart'; import 'package:diplomaticquarterapp/pages/vaccine/my_vaccines_screen.dart'; +import 'package:diplomaticquarterapp/theme/colors.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/medical/medical_profile_item.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/alert_dialog.dart'; @@ -751,7 +752,7 @@ class Utils { ); } - static Widget tableColumnValue(String text, {bool isLast = false, bool isCapitable = true, ProjectViewModel mProjectViewModel}) { + static Widget tableColumnValue(String text, {bool isLast = false, bool isCapitable = true, bool isHighLow = false, ProjectViewModel mProjectViewModel}) { ProjectViewModel projectViewModel = mProjectViewModel ?? Provider.of(AppGlobal.context); return Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -762,7 +763,7 @@ class Utils { isCapitable && !projectViewModel.isArabic ? text.toLowerCase().capitalizeFirstofEach : text, maxLines: 2, overflow: TextOverflow.ellipsis, - style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, color: Color(0xff575757), letterSpacing: -0.4, height: 16 / 10), + style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, color: isHighLow ? CustomColors.accentColor : Color(0xff575757), letterSpacing: -0.4, height: 16 / 10), ), SizedBox(height: 12), if (!isLast) diff --git a/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart b/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart index f8a0a9cc..7911b2ec 100644 --- a/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart +++ b/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart @@ -185,7 +185,7 @@ class LabResultWidget extends StatelessWidget { padding: EdgeInsets.only(left: projectViewModel.isArabic ? 0 : 12, right: projectViewModel.isArabic ? 12 : 0), child: Utils.tableColumnValue(labResultList[i].description ?? "", isLast: true, mProjectViewModel: projectViewModel), ), - Utils.tableColumnValue(labResultList[i].resultValue + " " + labResultList[i].uOM, isLast: true, mProjectViewModel: projectViewModel), + Utils.tableColumnValue(labResultList[i].resultValue + " " + labResultList[i].uOM, isHighLow: (labResultList[i].resultValueFlag.toLowerCase() == "h" || labResultList[i].resultValueFlag.toLowerCase() == "l"), isLast: true, mProjectViewModel: projectViewModel), Utils.tableColumnValue(labResultList[i].referanceRange, isLast: true, isCapitable: false, mProjectViewModel: projectViewModel), !checkIfCovidLab(patientLabResultList) ? InkWell( From faf3bbdd9ea8dbcd154e588bfa137c0fb4f1548d Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Sun, 10 Dec 2023 12:04:56 +0300 Subject: [PATCH 04/31] Unit column position changed --- .../medical/LabResult/LabResultWidget.dart | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart b/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart index 7911b2ec..eb15c1aa 100644 --- a/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart +++ b/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart @@ -160,8 +160,8 @@ class LabResultWidget extends StatelessWidget { children: [ Utils.tableColumnTitle(TranslationBase.of(context).description, showDivider: false), Utils.tableColumnTitle(TranslationBase.of(context).value, showDivider: false), - Utils.tableColumnTitle(TranslationBase.of(context).range, showDivider: false), Utils.tableColumnTitle(TranslationBase.of(context).unit, showDivider: false), + Utils.tableColumnTitle(TranslationBase.of(context).range, showDivider: false), ], ), ); @@ -185,8 +185,9 @@ class LabResultWidget extends StatelessWidget { padding: EdgeInsets.only(left: projectViewModel.isArabic ? 0 : 12, right: projectViewModel.isArabic ? 12 : 0), child: Utils.tableColumnValue(labResultList[i].description ?? "", isLast: true, mProjectViewModel: projectViewModel), ), - Utils.tableColumnValue(labResultList[i].resultValue + " " + labResultList[i].uOM, isHighLow: (labResultList[i].resultValueFlag.toLowerCase() == "h" || labResultList[i].resultValueFlag.toLowerCase() == "l"), isLast: true, mProjectViewModel: projectViewModel), - Utils.tableColumnValue(labResultList[i].referanceRange, isLast: true, isCapitable: false, mProjectViewModel: projectViewModel), + Utils.tableColumnValue(labResultList[i].resultValue + " " + labResultList[i].uOM, + isHighLow: (labResultList[i].resultValueFlag.toLowerCase() == "h" || labResultList[i].resultValueFlag.toLowerCase() == "l"), isLast: true, mProjectViewModel: projectViewModel), + Utils.tableColumnValue(labResultList[i].uOM, isLast: true, isCapitable: false), !checkIfCovidLab(patientLabResultList) ? InkWell( onTap: () { @@ -202,8 +203,7 @@ class LabResultWidget extends StatelessWidget { }, child: Padding( padding: EdgeInsets.only(left: !projectViewModel.isArabic ? 0 : 12, right: !projectViewModel.isArabic ? 12 : 0), - // child: Utils.tableColumnValueWithUnderLine(TranslationBase.of(context).viewFlowChart, isLast: true, isCapitable: false), - child: Utils.tableColumnValueWithFlowChart(labResultList[i].uOM, TranslationBase.of(context).viewFlowChart, isLast: true, isCapitable: false), + child: Utils.tableColumnValueWithFlowChart(labResultList[i].referanceRange, TranslationBase.of(context).viewFlowChart, isLast: true, isCapitable: false), ), ) : Container(), From 37aa700b2ee59fbd2b701830726fc89d96825311 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 3 Jan 2024 11:48:30 +0300 Subject: [PATCH 05/31] fixes --- lib/widgets/my_rich_text.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/widgets/my_rich_text.dart b/lib/widgets/my_rich_text.dart index cf426db5..a0af7774 100644 --- a/lib/widgets/my_rich_text.dart +++ b/lib/widgets/my_rich_text.dart @@ -11,14 +11,14 @@ class MyRichText extends StatelessWidget { @override Widget build(BuildContext context) { return RichText( - maxLines: 1, + maxLines: 2, text: TextSpan( text: title, style: TextStyle(fontSize: 10, fontWeight: FontWeight.w600, fontFamily: isArabic ? 'Cairo' : 'Poppins', color: Color(0xff575757), letterSpacing: -0.4, height: 18 / 10), children: [ TextSpan( text: " $value", - style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, fontFamily: isArabic ? 'Cairo' : 'Poppins', color: valueColor ?? Color(0xff2B353E), letterSpacing: -0.48, height: 18 / 12), + style: TextStyle(fontSize: 10, fontWeight: FontWeight.w600, fontFamily: isArabic ? 'Cairo' : 'Poppins', color: valueColor ?? Color(0xff2B353E), letterSpacing: -0.48, height: 18 / 12), ) ]), ); From 88d79367ba9af87768d8f780de51b3ad7dba0538 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Sun, 7 Jul 2024 11:34:08 +0300 Subject: [PATCH 06/31] updates & fixes --- .../EROnlineCheckInBookAppointment.dart | 6 +++--- .../EROnlineCheckInPaymentDetails.dart | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInBookAppointment.dart b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInBookAppointment.dart index 776dbf11..3b392501 100644 --- a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInBookAppointment.dart +++ b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInBookAppointment.dart @@ -24,7 +24,7 @@ class _EROnlineCheckInBookAppointmentState extends State projectsList = []; final GlobalKey projectDropdownKey = GlobalKey(); - late HospitalsModel selectedHospital; + HospitalsModel? selectedHospital; String projectDropdownValue = ""; @override @@ -145,9 +145,9 @@ class _EROnlineCheckInBookAppointmentState extends State with SingleTickerProviderStateMixin { late ProjectViewModel projectViewModel; - late EROnlineCheckInPaymentDetailsResponse erOnlineCheckInPaymentDetailsResponse; + EROnlineCheckInPaymentDetailsResponse? erOnlineCheckInPaymentDetailsResponse; String? selectedPaymentMethod; String? selectedInstallmentPlan; String transID = ""; @@ -277,7 +277,7 @@ class _EROnlineCheckInPaymentDetailsState extends State Date: Mon, 8 Jul 2024 00:21:26 +0300 Subject: [PATCH 07/31] Updates --- lib/config/config.dart | 4 ++-- .../EROnlineCheckIn/EROnlineCheckInPaymentDetails.dart | 4 ++-- lib/services/appointment_services/GetDoctorsList.dart | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index 249fe8fd..6789925d 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -22,8 +22,8 @@ var PACKAGES_ORDER_HISTORY = '/api/orders/items'; var PACKAGES_TAMARA_OPT = '/api/orders/paymentoptions/tamara'; // var BASE_URL = 'http://10.50.100.198:2018/'; // var BASE_URL = 'http://10.50.100.198:4422/'; -var BASE_URL = 'https://uat.hmgwebservices.com/'; -// var BASE_URL = 'https://hmgwebservices.com/'; +// var BASE_URL = 'https://uat.hmgwebservices.com/'; +var BASE_URL = 'https://hmgwebservices.com/'; // var BASE_URL = 'http://10.20.200.111:1010/'; // var BASE_URL = 'https://orash.cloudsolutions.com.sa/'; // var BASE_URL = 'https://vidauat.cloudsolutions.com.sa/'; diff --git a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInPaymentDetails.dart b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInPaymentDetails.dart index f946b357..c2028430 100644 --- a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInPaymentDetails.dart +++ b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInPaymentDetails.dart @@ -455,11 +455,11 @@ class _EROnlineCheckInPaymentDetailsState extends State Date: Sun, 14 Jul 2024 17:11:21 +0300 Subject: [PATCH 08/31] updates for ER Online-Checkin --- lib/config/config.dart | 8 +- .../EROnlineCheckIn/EROnlineCheckInHome.dart | 89 ++++++++++++++++--- .../EROnlineCheckInPaymentDetails.dart | 55 +++++++++++- .../fragments/home_page_fragment2.dart | 2 +- .../appointment_services/GetDoctorsList.dart | 34 ++++++- .../clinic_services/get_clinic_service.dart | 11 +++ lib/widgets/in_app_browser/InAppBrowser.dart | 6 +- 7 files changed, 180 insertions(+), 25 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index 6789925d..759e5204 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -20,10 +20,10 @@ var PACKAGES_SHOPPING_CART = '/api/shopping_cart_items'; var PACKAGES_ORDERS = '/api/orders'; var PACKAGES_ORDER_HISTORY = '/api/orders/items'; var PACKAGES_TAMARA_OPT = '/api/orders/paymentoptions/tamara'; -// var BASE_URL = 'http://10.50.100.198:2018/'; +// var BASE_URL = 'http://10.50.100.198:1022/'; // var BASE_URL = 'http://10.50.100.198:4422/'; -// var BASE_URL = 'https://uat.hmgwebservices.com/'; -var BASE_URL = 'https://hmgwebservices.com/'; +var BASE_URL = 'https://uat.hmgwebservices.com/'; +// var BASE_URL = 'https://hmgwebservices.com/'; // var BASE_URL = 'http://10.20.200.111:1010/'; // var BASE_URL = 'https://orash.cloudsolutions.com.sa/'; // var BASE_URL = 'https://vidauat.cloudsolutions.com.sa/'; @@ -671,6 +671,8 @@ var AUTO_GENERATE_INVOICE_ER = 'Services/OUTPs.svc/Rest/Outp_AutoGenerateInvoice var CHECK_IF_PATIENT_ARRIVED_ER_ONLINE_CHECKIN = 'Services/OUTPs.svc/Rest/IsPatientArrived'; +var CHECK_PATIENT_ER_CLINIC_BALANCE_AMOUNT = 'Services/OUTPs.svc/Rest/getPatientAdvanceBalanceAmountByClinic'; + var GET_PROJECT_FROM_NFC = 'Services/OUTPs.svc/Rest/GetProjectByNFC'; //PAYFORT diff --git a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart index bd09f05a..17d72248 100644 --- a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart +++ b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart @@ -1,6 +1,8 @@ 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'; @@ -31,7 +33,8 @@ class _EROnlineCheckInHomePageState extends State with @override void initState() { WidgetsBinding.instance.addPostFrameCallback((_) { - checkIfPatientHasArrived(); + // checkIfPatientHasArrived(); + checkPatientERClinicBalanceAmount(); }); super.initState(); } @@ -283,6 +286,7 @@ class _EROnlineCheckInHomePageState extends State with showNfcReader(context, onNcfScan: (String nfcId) { Future.delayed(const Duration(milliseconds: 100), () { print(nfcId); + getProjectIDFromNFC(nfcId, true); // Navigator.push(context, FadePage(page: EROnlineCheckInPaymentDetails())); }); }, onCancel: () { @@ -309,7 +313,7 @@ class _EROnlineCheckInHomePageState extends State with showNfcReader(context, onNcfScan: (String nfcId) { Future.delayed(const Duration(milliseconds: 100), () { print(nfcId); - getProjectIDFromNFC(nfcId); + getProjectIDFromNFC(nfcId, false); }); }, onCancel: () { Navigator.of(context).pop(); @@ -340,7 +344,7 @@ class _EROnlineCheckInHomePageState extends State with ); } - void getProjectIDFromNFC(String nfcID) { + void getProjectIDFromNFC(String nfcID, bool isArrived) { GifLoaderDialogUtils.showMyDialog(context); ClinicListService ancillaryOrdersService = new ClinicListService(); ancillaryOrdersService.getProjectIDFromNFC(nfcID).then((response) { @@ -348,17 +352,21 @@ class _EROnlineCheckInHomePageState extends State with print(response["GetProjectByNFC"]); int projectID = response['GetProjectByNFC'][0]["ProjectID"]; String projectName = response['GetProjectByNFC'][0]["ProjectName"]; - GifLoaderDialogUtils.hideDialog(context); - Navigator.push( - context, - FadePage( - page: EROnlineCheckInPaymentDetails( - projectID: projectID, - isERBookAppointment: false, - projectName: 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."); } @@ -382,4 +390,59 @@ class _EROnlineCheckInHomePageState extends State with GifLoaderDialogUtils.hideDialog(context); }); } + + autoGenerateInvoiceER(int projectID) { + DoctorsListService service = new DoctorsListService(); + service.autoGenerateInvoiceERClinicWithNoPaymentDetails(projectID, 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 _showMyDialog(String message, BuildContext context) async { + return showDialog( + context: context, + barrierDismissible: true, // user must tap button! + builder: (BuildContext context) { + return AlertDialog( + title: const Text('Alert'), + content: SingleChildScrollView( + child: ListBody( + children: [ + Text(message), + ], + ), + ), + actions: [ + TextButton( + child: const Text('OK'), + onPressed: () { + Navigator.of(context).pop(); + Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (context) => LandingPage()), (Route r) => false); + }, + ), + ], + ); + }, + ); + } + + void checkPatientERClinicBalanceAmount() { + GifLoaderDialogUtils.showMyDialog(context); + ClinicListService ancillaryOrdersService = new ClinicListService(); + ancillaryOrdersService.checkPatientERClinicBalanceAmount(10).then((response) { + print(response["BalanceAmount"]); + isPatientArrived = response['BalanceAmount'] > 0; + GifLoaderDialogUtils.hideDialog(context); + // erOnlineCheckInPaymentDetailsResponse = EROnlineCheckInPaymentDetailsResponse.fromJson(response["ResponsePatientShare"]); + setState(() {}); + }).catchError((err) { + AppToast.showErrorToast(message: err.toString()); + GifLoaderDialogUtils.hideDialog(context); + }); + } } diff --git a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInPaymentDetails.dart b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInPaymentDetails.dart index c2028430..f9e6016b 100644 --- a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInPaymentDetails.dart +++ b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInPaymentDetails.dart @@ -8,6 +8,7 @@ import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.da 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'; @@ -452,7 +453,8 @@ class _EROnlineCheckInPaymentDetailsState extends State _showMyDialog(String message, BuildContext context) async { + return showDialog( + context: context, + barrierDismissible: true, // user must tap button! + builder: (BuildContext context) { + return AlertDialog( + title: const Text('Alert'), + content: SingleChildScrollView( + child: ListBody( + children: [ + Text(message), + ], + ), + ), + actions: [ + TextButton( + child: const Text('OK'), + onPressed: () { + Navigator.of(context).pop(); + Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (context) => LandingPage()), (Route r) => false); + }, + ), + ], + ); + }, + ); + } + getEROnlineCheckInPaymentDetails() { GifLoaderDialogUtils.showMyDialog(context); ClinicListService ancillaryOrdersService = new ClinicListService(); diff --git a/lib/pages/landing/fragments/home_page_fragment2.dart b/lib/pages/landing/fragments/home_page_fragment2.dart index c1c922ac..7441f591 100644 --- a/lib/pages/landing/fragments/home_page_fragment2.dart +++ b/lib/pages/landing/fragments/home_page_fragment2.dart @@ -52,7 +52,7 @@ class _HomePageFragment2State extends State { hmgServices.add(HmgServices(0, TranslationBase.of(context).book, TranslationBase.of(context).appointmentLabel, "assets/images/new/book appointment.svg", isLogin)); hmgServices.add(HmgServices(1, TranslationBase.of(context).liveCare, TranslationBase.of(context).onlineConsulting, "assets/images/new/Live_Care.svg", isLogin)); - hmgServices.add(HmgServices(2, TranslationBase.of(context).emergencyTitle, TranslationBase.of(context).emergencySubtitle, "assets/images/new/emergency.svg", isLogin)); + hmgServices.add(HmgServices(2, TranslationBase.of(context).emergencyTitle, TranslationBase.of(context).onlineCheckIn, "assets/images/new/emergency.svg", isLogin)); hmgServices.add(HmgServices(3, TranslationBase.of(context).hhcHome, TranslationBase.of(context).healthCare, "assets/images/new/HHC.svg", isLogin)); hmgServices.add(HmgServices(4, TranslationBase.of(context).checkup, TranslationBase.of(context).comprehensive, "assets/images/new/comprehensive_checkup.svg", isLogin)); hmgServices.add(HmgServices(5, TranslationBase.of(context).online, TranslationBase.of(context).payment, "assets/images/new/paymentMethods.png", isLogin)); diff --git a/lib/services/appointment_services/GetDoctorsList.dart b/lib/services/appointment_services/GetDoctorsList.dart index c46fa30b..b06bb48e 100644 --- a/lib/services/appointment_services/GetDoctorsList.dart +++ b/lib/services/appointment_services/GetDoctorsList.dart @@ -28,9 +28,9 @@ class DoctorsListService extends BaseService { AuthenticatedUser authUser = new AuthenticatedUser(); AuthProvider authProvider = new AuthProvider(); - double? lat; - double? long; - String? deviceToken; + double? lat; + double? long; + String? deviceToken; String? tokenID; List selectedBodyPartList = []; @@ -1765,7 +1765,33 @@ class DoctorsListService extends BaseService { return Future.value(localRes); } - Future autoGenerateInvoiceERClinic(int projectID, int paymentMethod, String paymentReferenceNo, num amount, String cardType, String cardNumber, String orderID, String rrn, bool isAdvanceAvailable) async { + Future autoGenerateInvoiceERClinicWithNoPaymentDetails(int projectID, bool isAdvanceAvailable) async { + Map request; + request = { + "ProjectID": projectID, + "ClinicID": "10", + // "PaymentMethod": cardType, + // "PaymentReferenceNo": paymentReferenceNo, + // "PaymentAmount": amount, + // "CardType": cardType, + // "CardNumber": cardNumber, + // "OrderId": orderID, + "MemberID": 102, + // "RRN": rrn, + "IsAdvanceAvailable": isAdvanceAvailable + }; + dynamic localRes; + await baseAppClient.post(AUTO_GENERATE_INVOICE_ER, onSuccess: (response, statusCode) async { + localRes = response; + }, onFailure: (String error, int statusCode) { + throw error; + }, body: request); + + return Future.value(localRes); + } + + Future autoGenerateInvoiceERClinic( + int projectID, int paymentMethod, String paymentReferenceNo, num amount, String cardType, String cardNumber, String orderID, String rrn, bool isAdvanceAvailable) async { Map request; request = { "ProjectID": projectID, diff --git a/lib/services/clinic_services/get_clinic_service.dart b/lib/services/clinic_services/get_clinic_service.dart index 920615ee..d8aa4ca9 100644 --- a/lib/services/clinic_services/get_clinic_service.dart +++ b/lib/services/clinic_services/get_clinic_service.dart @@ -461,6 +461,17 @@ class ClinicListService extends BaseService { return Future.value(localRes); } + Future checkPatientERClinicBalanceAmount(int clinicID) async { + Map request = {"ClinicID": clinicID}; + dynamic localRes; + await baseAppClient.post(CHECK_PATIENT_ER_CLINIC_BALANCE_AMOUNT, onSuccess: (response, statusCode) async { + localRes = response; + }, onFailure: (String error, int statusCode) { + throw error; + }, body: request, isAllowAny: true); + return Future.value(localRes); + } + Future getProjectIDFromNFC(String nfcID) async { Map request = {"nFC_Code": nfcID}; dynamic localRes; diff --git a/lib/widgets/in_app_browser/InAppBrowser.dart b/lib/widgets/in_app_browser/InAppBrowser.dart index f353eec2..a04b5f03 100644 --- a/lib/widgets/in_app_browser/InAppBrowser.dart +++ b/lib/widgets/in_app_browser/InAppBrowser.dart @@ -38,9 +38,9 @@ class MyInAppBrowser extends InAppBrowser { static String APPLE_PAY_PAYFORT_URL = 'https://hmgwebservices.com/PayFortWebLive/PayFortApi/MakeApplePayRequest'; // Payfort Payment Gateway URL LIVE // static String APPLE_PAY_PAYFORT_URL = 'https://hmgwebservices.com/PayFortWebLive/PayFortApi/MakeApplePayRequest'; // Payfort Payment Gateway URL UAT - // static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; // Payfort Payment Gateway URL UAT + static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; // Payfort Payment Gateway URL UAT - static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWebLive/pages/SendPayFortRequest.aspx'; //Payfort Payment Gateway URL LIVE + // static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWebLive/pages/SendPayFortRequest.aspx'; //Payfort Payment Gateway URL LIVE // static String SERVICE_URL = 'https://uat.hmgwebservices.com/payfortforvidaplus/pages/SendPayFortRequest.aspx'; //Payfort Payment Gateway URL UAT VIDA PLUS @@ -343,7 +343,7 @@ class MyInAppBrowser extends InAppBrowser { form = form.replaceFirst('PROJECT_ID_VALUE', projId); form = form.replaceFirst('PAYMENT_OPTION_VALUE', paymentMethod); form = form.replaceFirst('LANG_VALUE', currentLanguageID); - form = form.replaceFirst('SERVICE_URL_VALUE', "https://mdlaboratories.com/tamaralive/Home/Checkout"); + form = form.replaceFirst('SERVICE_URL_VALUE', "https://mdlaboratories.com/tamara/Home/Checkout"); form = form.replaceFirst('INSTALLMENTS_VALUE', installments); form = form.replaceFirst('CUSTNATIONALID_VALUE', authUser.patientIdentificationNo!); From 4dc0a3f6c20ff33c56c3ef78b5ba5b1b4e8b3f48 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 15 Jul 2024 10:08:45 +0300 Subject: [PATCH 09/31] ER Online Check-In changes --- .../Clinics/EROnlineCheckInPaymentDetailsResponse.dart | 10 +++++----- .../ErService/EROnlineCheckIn/EROnlineCheckInHome.dart | 6 +++++- .../EROnlineCheckIn/EROnlineCheckInPaymentDetails.dart | 4 ++-- lib/services/appointment_services/GetDoctorsList.dart | 2 +- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/models/Clinics/EROnlineCheckInPaymentDetailsResponse.dart b/lib/models/Clinics/EROnlineCheckInPaymentDetailsResponse.dart index 1d4772fe..9cfe88ea 100644 --- a/lib/models/Clinics/EROnlineCheckInPaymentDetailsResponse.dart +++ b/lib/models/Clinics/EROnlineCheckInPaymentDetailsResponse.dart @@ -1,16 +1,16 @@ class EROnlineCheckInPaymentDetailsResponse { - int? cashPrice; - int? cashPriceTax; - int? cashPriceWithTax; + num? cashPrice; + num? cashPriceTax; + num? cashPriceWithTax; int? companyId; String? companyName; - int? companyShareWithTax; + num? companyShareWithTax; dynamic errCode; int? groupID; String? insurancePolicyNo; String? message; String? patientCardID; - double? patientShare; + num? patientShare; double? patientShareWithTax; double? patientTaxAmount; int? policyId; diff --git a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart index 17d72248..3f1c3c49 100644 --- a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart +++ b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart @@ -395,7 +395,11 @@ class _EROnlineCheckInHomePageState extends State with DoctorsListService service = new DoctorsListService(); service.autoGenerateInvoiceERClinicWithNoPaymentDetails(projectID, true).then((res) { GifLoaderDialogUtils.hideDialog(context); - _showMyDialog("Your online Check-In in the ER clinic has been done successfully.", 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); diff --git a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInPaymentDetails.dart b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInPaymentDetails.dart index f9e6016b..bffdb91b 100644 --- a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInPaymentDetails.dart +++ b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInPaymentDetails.dart @@ -483,7 +483,7 @@ class _EROnlineCheckInPaymentDetailsState extends State Date: Tue, 16 Jul 2024 12:21:55 +0300 Subject: [PATCH 10/31] ER Online Check-In fixes --- .../EROnlineCheckInPaymentDetailsResponse.dart | 4 ++-- .../EROnlineCheckIn/EROnlineCheckInHome.dart | 1 + .../EROnlineCheckInPaymentDetails.dart | 11 +++++------ lib/pages/insurance/insurance_update_screen.dart | 2 +- .../rateAppointment/rate_appointment_clinic.dart | 2 +- lib/services/payfort_services/payfort_service.dart | 2 +- lib/services/payfort_services/payfort_view_model.dart | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/models/Clinics/EROnlineCheckInPaymentDetailsResponse.dart b/lib/models/Clinics/EROnlineCheckInPaymentDetailsResponse.dart index 9cfe88ea..884c2e0c 100644 --- a/lib/models/Clinics/EROnlineCheckInPaymentDetailsResponse.dart +++ b/lib/models/Clinics/EROnlineCheckInPaymentDetailsResponse.dart @@ -11,8 +11,8 @@ class EROnlineCheckInPaymentDetailsResponse { String? message; String? patientCardID; num? patientShare; - double? patientShareWithTax; - double? patientTaxAmount; + num? patientShareWithTax; + num? patientTaxAmount; int? policyId; String? policyName; String? procedureId; diff --git a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart index 3f1c3c49..b3da67e1 100644 --- a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart +++ b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart @@ -441,6 +441,7 @@ class _EROnlineCheckInHomePageState extends State with ancillaryOrdersService.checkPatientERClinicBalanceAmount(10).then((response) { print(response["BalanceAmount"]); isPatientArrived = response['BalanceAmount'] > 0; + // isPatientArrived = false; GifLoaderDialogUtils.hideDialog(context); // erOnlineCheckInPaymentDetailsResponse = EROnlineCheckInPaymentDetailsResponse.fromJson(response["ResponsePatientShare"]); setState(() {}); diff --git a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInPaymentDetails.dart b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInPaymentDetails.dart index bffdb91b..08cc78f4 100644 --- a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInPaymentDetails.dart +++ b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInPaymentDetails.dart @@ -472,9 +472,7 @@ class _EROnlineCheckInPaymentDetailsState extends State LandingPage()), (Route r) => false); } else { autoGenerateInvoiceER(paymentRes); } diff --git a/lib/pages/insurance/insurance_update_screen.dart b/lib/pages/insurance/insurance_update_screen.dart index 191170ef..4c4d5686 100644 --- a/lib/pages/insurance/insurance_update_screen.dart +++ b/lib/pages/insurance/insurance_update_screen.dart @@ -167,7 +167,7 @@ class _InsuranceUpdateState extends State with SingleTickerProv Container( margin: EdgeInsets.only(top: 6.5, left: 2.0), child: Text( - model.insuranceUpdate[index].statusDescription!, + model.insuranceUpdate[index].statusDescription ?? "", style: TextStyle( fontSize: 10, fontWeight: FontWeight.w600, diff --git a/lib/pages/rateAppointment/rate_appointment_clinic.dart b/lib/pages/rateAppointment/rate_appointment_clinic.dart index 3f61f3e9..44484373 100644 --- a/lib/pages/rateAppointment/rate_appointment_clinic.dart +++ b/lib/pages/rateAppointment/rate_appointment_clinic.dart @@ -95,7 +95,7 @@ class _RateAppointmentClinicState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ - MyRichText(TranslationBase.of(context).clinic + ":", model.appointmentDetails.projectName, projectViewModel.isArabic), + MyRichText(TranslationBase.of(context).clinic + ":", model.appointmentDetails.projectName ?? "", projectViewModel.isArabic), MyRichText(TranslationBase.of(context).date + ":", DateUtil.getDayMonthYearDateFormatted(DateUtil.convertStringToDate(model.appointmentDetails.appointmentDate)), projectViewModel.isArabic), ], diff --git a/lib/services/payfort_services/payfort_service.dart b/lib/services/payfort_services/payfort_service.dart index 4cc203e2..a1bbccd8 100644 --- a/lib/services/payfort_services/payfort_service.dart +++ b/lib/services/payfort_services/payfort_service.dart @@ -143,7 +143,7 @@ class PayfortService extends BaseService { String? customerName, String? customerEmail, String? orderDescription, - double? orderAmount, + num? orderAmount, String? merchantIdentifier, String? applePayAccessCode, String? applePayShaRequestPhrase, diff --git a/lib/services/payfort_services/payfort_view_model.dart b/lib/services/payfort_services/payfort_view_model.dart index 17f739db..29a79f14 100644 --- a/lib/services/payfort_services/payfort_view_model.dart +++ b/lib/services/payfort_services/payfort_view_model.dart @@ -45,7 +45,7 @@ class PayfortViewModel extends ChangeNotifier { String? customerEmail, String? orderDescription, String? merchantReference, - double? orderAmount, + num? orderAmount, PayfortProjectDetailsRespModel? payfortProjectDetailsRespModel, SucceededCallback? onSuccess, FailedCallback? onFailed, From 41b0e65e41dbc841e27336c62363c7fb46e5cd57 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 25 Nov 2024 11:11:57 +0300 Subject: [PATCH 11/31] iOS Calendar fix --- .../widgets/AppointmentActions.dart | 3 +-- lib/uitl/CalendarUtils.dart | 26 ++++++++++++------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/lib/pages/MyAppointments/widgets/AppointmentActions.dart b/lib/pages/MyAppointments/widgets/AppointmentActions.dart index feb7a514..61fddab8 100644 --- a/lib/pages/MyAppointments/widgets/AppointmentActions.dart +++ b/lib/pages/MyAppointments/widgets/AppointmentActions.dart @@ -131,8 +131,7 @@ class _AppointmentActionsState extends State { .parse(DateUtil.formatDateToDate(DateUtil.convertStringToDate(widget.appo.appointmentDate!), widget.projectViewModel!.isArabic) + " " + widget.appo.startTime!), //DateUtil.convertStringToDate(widget.appo.appointmentDate), widget.appo.doctorNameObj!, - "", - + widget.appo.appointmentNo.toString(), DateUtil.formatDateToDate(DateUtil.convertStringToDate(widget.appo.appointmentDate!), widget.projectViewModel!.isArabic), // DateUtil.formatDateToTime(DateUtil.convertStringToDate(widget.appo.appointmentDate)), widget.appo.startTime!, diff --git a/lib/uitl/CalendarUtils.dart b/lib/uitl/CalendarUtils.dart index cf67bb57..59f33f10 100644 --- a/lib/uitl/CalendarUtils.dart +++ b/lib/uitl/CalendarUtils.dart @@ -5,6 +5,7 @@ import 'dart:ui'; import 'package:device_calendar/device_calendar.dart'; import 'package:manage_calendar_events/manage_calendar_events.dart' as ios; +import 'package:timezone/data/latest.dart' as tzl; final DeviceCalendarPlugin deviceCalendarPlugin = DeviceCalendarPlugin(); final ios.CalendarPlugin _myPlugin = ios.CalendarPlugin(); @@ -44,6 +45,7 @@ class CalendarUtils { // } static Future getInstance() async { + tzl.initializeTimeZones(); if (_completer != null) { return _completer!.future; } @@ -108,10 +110,10 @@ class CalendarUtils { TZDateTime scheduleDateTimeUTZ = TZDateTime.from(scheduleDateTime!, _currentLocation); - print("writableCalendars-name: " + writableCalendars.name); - print("writableCalendars-Id: " + writableCalendars.id); - print("writableCalendarsToString: " + writableCalendars.toString()); - print("writableCalendarsToString: " + writableCalendars!.id!); + print("writableCalendars-name: " + writableCalendars.name); + print("writableCalendars-Id: " + writableCalendars.id); + print("writableCalendarsToString: " + writableCalendars.toString()); + print("writableCalendarsToString: " + writableCalendars!.id!); Event event = Event( writableCalendars!.id, start: scheduleDateTimeUTZ, @@ -120,8 +122,10 @@ class CalendarUtils { description: description, ); + ios.CalendarEvent iosCalEvent = + ios.CalendarEvent(eventId: eventId, startDate: scheduleDateTimeUTZ, endDate: scheduleDateTimeUTZ.add(Duration(minutes: 30)), title: title, description: description, isAllDay: false); - if(Platform.isAndroid) { + if (Platform.isAndroid) { Result result = await deviceCalendarPlugin.hasPermissions(); print(result); await deviceCalendarPlugin.createOrUpdateEvent(event).catchError((e) { @@ -129,11 +133,15 @@ class CalendarUtils { }).whenComplete(() { print("whenComplete Calender ID " + eventId!); }); + } else { + // Result result = await deviceCalendarPlugin.hasPermissions(); + // print(result); + await _myPlugin.createEvent(calendarId: writableCalendars.id!, event: iosCalEvent).catchError((e) { + print("catchError " + e.toString()); + }).whenComplete(() { + print("whenComplete Calender ID iOS " + eventId!); + }); } - - - - } deleteEvent(Calendar _calendar, Event _event) async { From 8e46738982182db117df3645ac798527e979a4c7 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 25 Nov 2024 12:08:07 +0300 Subject: [PATCH 12/31] bug fixes --- lib/config/localized_values.dart | 2 ++ .../inpatient_pending_advance_payment.dart | 2 +- lib/pages/InPatientServices/inpatient_home.dart | 14 +++----------- lib/uitl/translations_delegate_base.dart | 4 ++-- 4 files changed, 8 insertions(+), 14 deletions(-) diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 8bd2ae36..87f17bbf 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1921,6 +1921,8 @@ const Map localizedValues = { "consent": {"en": "Consent", "ar": "التنويم"}, "generalInstructionsTitle": {"en": "General", "ar": "تعليمات"}, "generalInstructionsSubTitle": {"en": "Instructions", "ar": "التنويم العامة"}, + "generalConsentTitle": {"en": "General", "ar": "الموافقة"}, + "generalConsentSubTitle": {"en": "Consent", "ar": "العامة"}, "medicalInstructionsTitle": {"en": "Medical", "ar": "التعليمات الطبية"}, "medicalInstructionsSubTitle": {"en": "Instructions", "ar": "قبل التنويم"}, "mealPlanTitle": {"en": "Meal Plan", "ar": "خدمات"}, diff --git a/lib/pages/InPatientServices/components/inpatient_pending_advance_payment.dart b/lib/pages/InPatientServices/components/inpatient_pending_advance_payment.dart index e636e810..14bf116f 100644 --- a/lib/pages/InPatientServices/components/inpatient_pending_advance_payment.dart +++ b/lib/pages/InPatientServices/components/inpatient_pending_advance_payment.dart @@ -32,7 +32,7 @@ class _InPatientPendingAdvancePaymentState extends State { openPatientGeneralConsent(); }, child: MedicalProfileItem( - title: TranslationBase.of(context).generalInstructionsTitle, + title: TranslationBase.of(context).generalConsentTitle, imagePath: 'general_instructions.svg', - subTitle: TranslationBase.of(context).consent, + subTitle: TranslationBase.of(context).generalConsentSubTitle, width: 50.0, height: 40.0, isInPatient: true, @@ -278,7 +278,6 @@ class _InPatientServicesHomeState extends State { ClinicListService service = new ClinicListService(); GifLoaderDialogUtils.showMyDialog(context); service.getDischargeMedicationOrder(projectViewModel.getAdmissionInfoResponseModel).then((res) { - print(res["PatientHasDischargeMedicineList"].length); setState(() { if (res["PatientHasDischargeMedicineList"].length != 0) { isReceivePrescriptionEnabled = true; @@ -311,7 +310,6 @@ class _InPatientServicesHomeState extends State { service.getBirthNotification(projectViewModel.user.patientID!, projectViewModel.isArabic ? 1 : 2, context).then((res) { GifLoaderDialogUtils.hideDialog(context); if (res["MessageStatus"] == 1) { - print(res['birthNotification']); Navigator.push(context, FadePage(page: BirthNotification())); } else { AppToast.showErrorToast(message: res["endUserMessage"]); @@ -335,7 +333,6 @@ class _InPatientServicesHomeState extends State { getGeneralInstructionsList.add(new GetGeneralInstructions.fromJson(v)); }); GifLoaderDialogUtils.hideDialog(context); - print(res['generalInstructions']); Navigator.push(context, FadePage(page: GeneralInstructions(getGeneralInstructionsList: getGeneralInstructionsList))); } else { GifLoaderDialogUtils.hideDialog(context); @@ -356,7 +353,6 @@ class _InPatientServicesHomeState extends State { getMedicalInstructionsList.add(new GetMedicalInstructions.fromJson(v)); }); GifLoaderDialogUtils.hideDialog(context); - print(res['MedicalInstruction']); Navigator.push(context, FadePage(page: MedicalInstructionsPage(getMedicalInstructionsList: getMedicalInstructionsList))); } else { GifLoaderDialogUtils.hideDialog(context); @@ -380,7 +376,7 @@ class _InPatientServicesHomeState extends State { .then((res) { GifLoaderDialogUtils.hideDialog(context); if (res["MessageStatus"] == 1) { - if (res['responseInpatient'] != null) { + if (res['responseInpatient'] != null && res['responseInpatient']['responseInpatientAdvanceInfo'].length != 0) { inPatientAdvanceResponseModel = InPatientAdvanceResponseModel.fromJson(res["responseInpatient"]); Navigator.push(context, FadePage(page: InPatientAdvancePayment(isHasData: inPatientAdvanceResponseModel.responseInpatientAdvanceInfo != null, inPatientAdvanceResponseModel: inPatientAdvanceResponseModel))); @@ -398,8 +394,6 @@ class _InPatientServicesHomeState extends State { } void checkCurrentTime(BuildContext context) { - print(DateTime.now().hour); - print(DateTime.now().minute); if (DateTime.now().hour >= 7 && DateTime.now().hour <= 22) { Navigator.push(context, FadePage(page: HelpPRO())); } else { @@ -415,8 +409,6 @@ class _InPatientServicesHomeState extends State { } bool checkAdmissionRequestDate() { - print(DateUtil.convertStringToDate(projectViewModel.getAdmissionRequestInfoResponseModel.expectedAdmissionDate)); - print(DateUtil.convertStringToDate(projectViewModel.getAdmissionRequestInfoResponseModel.expectedAdmissionDate).difference(DateTime.now()).inHours); if (DateUtil.convertStringToDate(projectViewModel.getAdmissionRequestInfoResponseModel.expectedAdmissionDate).difference(DateTime.now()).inHours > 24) { return false; } diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 7686e463..862eb931 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -3018,8 +3018,8 @@ class TranslationBase { String get continueAgreeTerms => localizedValues["continueAgreeTerms"][locale.languageCode]; String get agreeText => localizedValues["agreeText"][locale.languageCode]; String get ERCheckInSuccess => localizedValues["ERCheckInSuccess"][locale.languageCode]; - - + String get generalConsentTitle => localizedValues["generalConsentTitle"][locale.languageCode]; + String get generalConsentSubTitle => localizedValues["generalConsentSubTitle"][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { From 091f3b08304d85c56ff2e32bc0e56161ea5e0e1a Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 27 Nov 2024 13:43:29 +0300 Subject: [PATCH 13/31] CRs 5656, 5801 & 6265 (InPatient CRs & ER Online Check-In) update to stores with versionID 16.8 --- lib/config/config.dart | 2 +- .../EROnlineCheckIn/EROnlineCheckInHome.dart | 2 +- .../inpatient_pending_advance_payment.dart | 25 +++++++++++-------- .../InPatientServices/inpatient_home.dart | 12 ++++++--- .../clinic_services/get_clinic_service.dart | 4 +-- pubspec.yaml | 2 +- 6 files changed, 28 insertions(+), 19 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index 1d28ade7..1cbc4ee3 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -355,7 +355,7 @@ var CAN_PAY_FOR_FOR_WALKIN_APPOINTMENT = 'Services/Doctors.svc/REST/CanPayForWal var CHANNEL = 3; var GENERAL_ID = 'Cs2020@2016\$2958'; var IP_ADDRESS = '10.20.10.20'; -var VERSION_ID = 16.7; +var VERSION_ID = 16.8; var SETUP_ID = '91877'; var LANGUAGE = 2; // var PATIENT_OUT_SA = 0; diff --git a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart index 6bc73b21..307eceb6 100644 --- a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart +++ b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart @@ -324,7 +324,7 @@ class _EROnlineCheckInHomePageState extends State with }); } else { //NFCNotSupported - AppToast.showErrorToast(message: TranslationBase.of(context).NFCNotSupported); + AppToast.showErrorToast(message: TranslationBase.of(context).NFCNotSupported, localContext: context); } }, color: CustomColors.green, diff --git a/lib/pages/InPatientServices/components/inpatient_pending_advance_payment.dart b/lib/pages/InPatientServices/components/inpatient_pending_advance_payment.dart index 14bf116f..690f1371 100644 --- a/lib/pages/InPatientServices/components/inpatient_pending_advance_payment.dart +++ b/lib/pages/InPatientServices/components/inpatient_pending_advance_payment.dart @@ -13,6 +13,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart'; import 'package:provider/provider.dart'; import 'package:share_plus/share_plus.dart'; +import 'package:url_launcher/url_launcher.dart'; class InPatientPendingAdvancePayment extends StatefulWidget { InPatientAdvanceResponseModel inPatientAdvanceResponseModel; @@ -254,17 +255,17 @@ class _InPatientPendingAdvancePaymentState extends State { void openBirthNotificationsPage(BuildContext context) { ClinicListService service = new ClinicListService(); GifLoaderDialogUtils.showMyDialog(context); - service.getBirthNotification(projectViewModel.user.patientID!, projectViewModel.isArabic ? 1 : 2, context).then((res) { + service + .getBirthNotification( + projectViewModel.user.patientID!, + projectViewModel.isPatientAdmitted ? projectViewModel.getAdmissionInfoResponseModel.projectID! : projectViewModel.getAdmissionRequestInfoResponseModel.projectId!, + projectViewModel.isArabic ? 1 : 2, + context) + .then((res) { GifLoaderDialogUtils.hideDialog(context); if (res["MessageStatus"] == 1) { Navigator.push(context, FadePage(page: BirthNotification())); } else { - AppToast.showErrorToast(message: res["endUserMessage"]); + AppToast.showErrorToast(message: res["endUserMessage"], localContext: context); } }).catchError((err) { print(err); @@ -376,7 +382,7 @@ class _InPatientServicesHomeState extends State { .then((res) { GifLoaderDialogUtils.hideDialog(context); if (res["MessageStatus"] == 1) { - if (res['responseInpatient'] != null && res['responseInpatient']['responseInpatientAdvanceInfo'].length != 0) { + if (res['responseInpatient'] != null && res['responseInpatient']['responseInpatientAdvanceInfo'] != null && res['responseInpatient']['responseInpatientAdvanceInfo'].length != 0) { inPatientAdvanceResponseModel = InPatientAdvanceResponseModel.fromJson(res["responseInpatient"]); Navigator.push(context, FadePage(page: InPatientAdvancePayment(isHasData: inPatientAdvanceResponseModel.responseInpatientAdvanceInfo != null, inPatientAdvanceResponseModel: inPatientAdvanceResponseModel))); diff --git a/lib/services/clinic_services/get_clinic_service.dart b/lib/services/clinic_services/get_clinic_service.dart index 4aa10e51..af2828cc 100644 --- a/lib/services/clinic_services/get_clinic_service.dart +++ b/lib/services/clinic_services/get_clinic_service.dart @@ -306,9 +306,9 @@ class ClinicListService extends BaseService { return Future.value(localRes); } - Future getBirthNotification(num motherMRN, int languageID, context) async { + Future getBirthNotification(num motherMRN, int projectID, int languageID, context) async { Map request; - request = {"mothermrn": motherMRN, "LanguageID": languageID}; + request = {"mothermrn": motherMRN, "LanguageID": languageID, "ProjectID": projectID}; dynamic localRes; diff --git a/pubspec.yaml b/pubspec.yaml index 16e395b3..c1b12fcb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: diplomaticquarterapp description: A new Flutter application. -version: 4.5.069+4050069 +version: 4.5.070+4050070 environment: sdk: ">=3.0.0 <3.13.0" From 20bfdc3652a46798293f723c488d9b0cc68c5309 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Sun, 1 Dec 2024 11:41:39 +0300 Subject: [PATCH 14/31] Project Name Top & Bottom changes implemented --- lib/config/config.dart | 20 +++++++------- lib/config/localized_values.dart | 1 + lib/core/service/client/base_app_client.dart | 6 ++--- .../Appointments/DoctorListResponse.dart | 4 ++- lib/models/hmg_services.dart | 3 ++- .../bmi_calculator/bariatrics-screen.dart | 2 +- .../bmi_calculator/result_page.dart | 2 +- .../bmr_calculator/bmr_result_page.dart | 2 +- .../body_fat/body_fat_result_page.dart | 2 +- .../calorie_result_page.dart | 2 +- .../carbs/carbs_result_page.dart | 2 +- .../delivery_due_result_page.dart | 2 +- .../ideal_body/ideal_body_result_page.dart | 12 +++++++-- .../ovulation_result_page.dart | 2 +- .../BookAppointment/DentalComplaints.dart | 10 ++++--- lib/pages/BookAppointment/SearchResults.dart | 11 ++++++++ .../components/LaserClinic.dart | 12 ++++++--- .../components/SearchByClinic.dart | 10 ++++--- .../components/SearchByDoctor.dart | 16 +++++++---- .../components/search_by_hospital_name.dart | 1 + .../widgets/DentalComplaintCard.dart | 12 ++++++--- .../EROnlineCheckInBookAppointment.dart | 2 +- .../EROnlineCheckIn/EROnlineCheckInHome.dart | 5 ++++ lib/pages/ToDoList/ToDo.dart | 1 + .../fragments/home_page_fragment2.dart | 17 +++++++----- lib/pages/landing/widgets/services_view.dart | 2 +- lib/pages/livecare/widgets/clinic_list.dart | 3 ++- lib/pages/login/login.dart | 2 +- lib/uitl/translations_delegate_base.dart | 1 + lib/widgets/in_app_browser/InAppBrowser.dart | 6 ++--- .../others/app_expandable_notifier.dart | 27 ++++++++++++++----- pubspec.yaml | 2 +- 32 files changed, 137 insertions(+), 65 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index 1cbc4ee3..648d52ae 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -20,17 +20,17 @@ var PACKAGES_SHOPPING_CART = '/api/shopping_cart_items'; var PACKAGES_ORDERS = '/api/orders'; var PACKAGES_ORDER_HISTORY = '/api/orders/items'; var PACKAGES_TAMARA_OPT = '/api/orders/paymentoptions/tamara'; -// var BASE_URL = 'http://10.50.100.198:2018/'; -// var BASE_URL = 'http://10.50.100.198:4422/'; -var BASE_URL = 'https://uat.hmgwebservices.com/'; +// var BASE_URL = 'http://10.50.100.198:2018/'; +// var BASE_URL = 'http://10.50.100.198:4422/'; +// var BASE_URL = 'https://uat.hmgwebservices.com/'; // var BASE_URL = 'https://hmgwebservices.com/'; -// var BASE_URL = 'http://10.20.200.111:1010/'; +// var BASE_URL = 'http://10.20.200.111:1010/'; // var BASE_URL = 'https://hmgwebservices.com/'; // var BASE_URL = 'https://orash.cloudsolutions.com.sa/'; // var BASE_URL = 'https://vidauat.cloudsolutions.com.sa/'; // var BASE_URL = 'https://vidamergeuat.cloudsolutions.com.sa/'; -// var BASE_URL = 'https://webservices.hmg.com/'; +var BASE_URL = 'https://webservices.hmg.com/'; // var BASE_URL = 'http://10.50.100.198:4422/'; @@ -355,7 +355,7 @@ var CAN_PAY_FOR_FOR_WALKIN_APPOINTMENT = 'Services/Doctors.svc/REST/CanPayForWal var CHANNEL = 3; var GENERAL_ID = 'Cs2020@2016\$2958'; var IP_ADDRESS = '10.20.10.20'; -var VERSION_ID = 16.8; +var VERSION_ID = 16.9; var SETUP_ID = '91877'; var LANGUAGE = 2; // var PATIENT_OUT_SA = 0; @@ -698,10 +698,10 @@ var GET_PROJECT_FROM_NFC = 'Services/OUTPs.svc/Rest/GetProjectByNFC'; //PAYFORT var getPayFortProjectDetails = "Services/PayFort_Serv.svc/REST/GetPayFortProjectDetails"; var addPayFortApplePayResponse = "Services/PayFort_Serv.svc/REST/AddResponse"; -// var payFortEnvironment = FortEnvironment.production; -// var applePayMerchantId = "merchant.com.hmgwebservices"; -var payFortEnvironment = FortEnvironment.test; -var applePayMerchantId = "merchant.com.hmgwebservices.uat"; +var payFortEnvironment = FortEnvironment.production; +var applePayMerchantId = "merchant.com.hmgwebservices"; +// var payFortEnvironment = FortEnvironment.test; +// var applePayMerchantId = "merchant.com.hmgwebservices.uat"; class AppGlobal { static var context; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 87f17bbf..5912d123 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -2116,4 +2116,5 @@ const Map localizedValues = { "ar": "لقد قرأت وفهمت وأوافق على الشروط والأحكام المبينة أعلاه وأوافق على الإلتزام بالمتطلبات المذكورة تجاه المستشفى ، لقد قرأت التفاصيل المبينة في نموذج التسجيل الخاص بي وأقر بأنها صحيحة. أنا الموقع ادناه أقر بأنه أتيحت لي الفرصة لطرح الأسئلة والتحفظات بشأن هذه الموافقة، وتلقيت إجابات مرضية على جميع إستفساراتي." }, + "incorrectNationalId": {"en": "Incorrect National ID", "ar": "رقم الهوية غير صحيحة"}, }; diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index 37a3a722..ac2c60ca 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -184,7 +184,7 @@ class BaseAppClient { // body['IdentificationNo'] = 1023854217; // body['MobileNo'] = "531940021"; //0560717232 - // body['PatientID'] = 4768303; //4609100 + // body['PatientID'] = 4769791; //4609100 // body['TokenID'] = "@dm!n"; // Patient ID: 3027574 @@ -199,9 +199,9 @@ class BaseAppClient { // } // if (AppGlobal.isNetworkDebugEnabled) { - print("URL : $url"); + debugPrint("URL : $url"); final jsonBody = json.encode(body); - print(jsonBody); + debugPrint(jsonBody); // } if (await Utils.checkConnection(bypassConnectionCheck: bypassConnectionCheck)) { diff --git a/lib/models/Appointments/DoctorListResponse.dart b/lib/models/Appointments/DoctorListResponse.dart index 93cb81e5..c7ecdfcd 100644 --- a/lib/models/Appointments/DoctorListResponse.dart +++ b/lib/models/Appointments/DoctorListResponse.dart @@ -204,8 +204,10 @@ class PatientDoctorAppointmentList { String? filterName = ""; String? distanceInKMs = ""; List? patientDoctorAppointmentList = []; + String? projectTopName = ""; + String? projectBottomName = ""; - PatientDoctorAppointmentList({this.filterName, this.distanceInKMs, DoctorList? patientDoctorAppointment}) { + PatientDoctorAppointmentList({this.filterName, this.distanceInKMs, this.projectTopName, this.projectBottomName, DoctorList? patientDoctorAppointment}) { patientDoctorAppointmentList!.add(patientDoctorAppointment!); } } diff --git a/lib/models/hmg_services.dart b/lib/models/hmg_services.dart index c4163bd4..793800fa 100644 --- a/lib/models/hmg_services.dart +++ b/lib/models/hmg_services.dart @@ -4,6 +4,7 @@ class HmgServices { String subTitle; String icon; bool isLogin; + bool isLocked; - HmgServices(this.action, this.title, this.subTitle, this.icon,this.isLogin); + HmgServices(this.action, this.title, this.subTitle, this.icon, this.isLogin, {this.isLocked = false}); } diff --git a/lib/pages/AlHabibMedicalService/health_calculator/bmi_calculator/bariatrics-screen.dart b/lib/pages/AlHabibMedicalService/health_calculator/bmi_calculator/bariatrics-screen.dart index 66c50e5b..f3b88a60 100644 --- a/lib/pages/AlHabibMedicalService/health_calculator/bmi_calculator/bariatrics-screen.dart +++ b/lib/pages/AlHabibMedicalService/health_calculator/bmi_calculator/bariatrics-screen.dart @@ -190,7 +190,7 @@ class _BariatricsPageState extends State { } Future navigateToSearchResults(context, List docList, List patientDoctorAppointmentListHospital) async { - Navigator.push(context, FadePage(page: SearchResults(isLiveCareAppointment: false, doctorsList: docList, patientDoctorAppointmentListHospital: patientDoctorAppointmentListHospital))) + Navigator.push(context, FadePage(page: SearchResults(isLiveCareAppointment: false, doctorsList: docList, patientDoctorAppointmentListHospital: patientDoctorAppointmentListHospital, isDoctorSearchResult: false,))) .then((value) { setState(() { // dropdownValue = null; diff --git a/lib/pages/AlHabibMedicalService/health_calculator/bmi_calculator/result_page.dart b/lib/pages/AlHabibMedicalService/health_calculator/bmi_calculator/result_page.dart index 95bfdf0a..26222569 100644 --- a/lib/pages/AlHabibMedicalService/health_calculator/bmi_calculator/result_page.dart +++ b/lib/pages/AlHabibMedicalService/health_calculator/bmi_calculator/result_page.dart @@ -188,7 +188,7 @@ class _ResultPageState extends State { } Future navigateToSearchResults(context, List docList, List patientDoctorAppointmentListHospital) async { - Navigator.push(context, FadePage(page: SearchResults(isLiveCareAppointment: false, doctorsList: docList, patientDoctorAppointmentListHospital: patientDoctorAppointmentListHospital))) + Navigator.push(context, FadePage(page: SearchResults(isLiveCareAppointment: false, doctorsList: docList, patientDoctorAppointmentListHospital: patientDoctorAppointmentListHospital, isDoctorSearchResult: false,))) .then((value) { setState(() { // dropdownValue = null; diff --git a/lib/pages/AlHabibMedicalService/health_calculator/bmr_calculator/bmr_result_page.dart b/lib/pages/AlHabibMedicalService/health_calculator/bmr_calculator/bmr_result_page.dart index 33ff10b4..79060a2d 100644 --- a/lib/pages/AlHabibMedicalService/health_calculator/bmr_calculator/bmr_result_page.dart +++ b/lib/pages/AlHabibMedicalService/health_calculator/bmr_calculator/bmr_result_page.dart @@ -154,7 +154,7 @@ class BmrResultPage extends StatelessWidget { } }); - Navigator.push(context, FadePage(page: SearchResults(isLiveCareAppointment: false, doctorsList: doctorsList, patientDoctorAppointmentListHospital: _patientDoctorAppointmentListHospital))); + Navigator.push(context, FadePage(page: SearchResults(isLiveCareAppointment: false, doctorsList: doctorsList, patientDoctorAppointmentListHospital: _patientDoctorAppointmentListHospital, isDoctorSearchResult: false,))); } } }).catchError((err) { diff --git a/lib/pages/AlHabibMedicalService/health_calculator/body_fat/body_fat_result_page.dart b/lib/pages/AlHabibMedicalService/health_calculator/body_fat/body_fat_result_page.dart index 94e7796c..79014ba2 100644 --- a/lib/pages/AlHabibMedicalService/health_calculator/body_fat/body_fat_result_page.dart +++ b/lib/pages/AlHabibMedicalService/health_calculator/body_fat/body_fat_result_page.dart @@ -150,7 +150,7 @@ class FatResult extends StatelessWidget { } }); - Navigator.push(context, FadePage(page: SearchResults(isLiveCareAppointment: false, doctorsList: doctorsList, patientDoctorAppointmentListHospital: _patientDoctorAppointmentListHospital))); + Navigator.push(context, FadePage(page: SearchResults(isLiveCareAppointment: false, doctorsList: doctorsList, patientDoctorAppointmentListHospital: _patientDoctorAppointmentListHospital, isDoctorSearchResult: false,))); } } }).catchError((err) { diff --git a/lib/pages/AlHabibMedicalService/health_calculator/calorie_calculator/calorie_result_page.dart b/lib/pages/AlHabibMedicalService/health_calculator/calorie_calculator/calorie_result_page.dart index ac67f1d8..5844b006 100644 --- a/lib/pages/AlHabibMedicalService/health_calculator/calorie_calculator/calorie_result_page.dart +++ b/lib/pages/AlHabibMedicalService/health_calculator/calorie_calculator/calorie_result_page.dart @@ -155,7 +155,7 @@ class CalorieResultPage extends StatelessWidget { } }); - Navigator.push(context, FadePage(page: SearchResults(isLiveCareAppointment: false, doctorsList: doctorsList, patientDoctorAppointmentListHospital: _patientDoctorAppointmentListHospital))); + Navigator.push(context, FadePage(page: SearchResults(isLiveCareAppointment: false, doctorsList: doctorsList, patientDoctorAppointmentListHospital: _patientDoctorAppointmentListHospital, isDoctorSearchResult: false,))); } } }).catchError((err) { diff --git a/lib/pages/AlHabibMedicalService/health_calculator/carbs/carbs_result_page.dart b/lib/pages/AlHabibMedicalService/health_calculator/carbs/carbs_result_page.dart index 99ab9ecb..29257ccc 100644 --- a/lib/pages/AlHabibMedicalService/health_calculator/carbs/carbs_result_page.dart +++ b/lib/pages/AlHabibMedicalService/health_calculator/carbs/carbs_result_page.dart @@ -176,7 +176,7 @@ class CarbsResult extends StatelessWidget { } }); - Navigator.push(context, FadePage(page: SearchResults(isLiveCareAppointment: false, doctorsList: doctorsList, patientDoctorAppointmentListHospital: _patientDoctorAppointmentListHospital))); + Navigator.push(context, FadePage(page: SearchResults(isLiveCareAppointment: false, doctorsList: doctorsList, patientDoctorAppointmentListHospital: _patientDoctorAppointmentListHospital, isDoctorSearchResult: false,))); } } }).catchError((err) { diff --git a/lib/pages/AlHabibMedicalService/health_calculator/delivery_due/delivery_due_result_page.dart b/lib/pages/AlHabibMedicalService/health_calculator/delivery_due/delivery_due_result_page.dart index e1364e73..84dc5e5e 100644 --- a/lib/pages/AlHabibMedicalService/health_calculator/delivery_due/delivery_due_result_page.dart +++ b/lib/pages/AlHabibMedicalService/health_calculator/delivery_due/delivery_due_result_page.dart @@ -176,7 +176,7 @@ class DeliveryDueResult extends StatelessWidget { } }); - Navigator.push(context, FadePage(page: SearchResults(isLiveCareAppointment: false, doctorsList: doctorsList, patientDoctorAppointmentListHospital: _patientDoctorAppointmentListHospital))); + Navigator.push(context, FadePage(page: SearchResults(isLiveCareAppointment: false, doctorsList: doctorsList, patientDoctorAppointmentListHospital: _patientDoctorAppointmentListHospital, isDoctorSearchResult: false,))); } } }).catchError((err) { diff --git a/lib/pages/AlHabibMedicalService/health_calculator/ideal_body/ideal_body_result_page.dart b/lib/pages/AlHabibMedicalService/health_calculator/ideal_body/ideal_body_result_page.dart index 40dae7c9..1fa9d2a9 100644 --- a/lib/pages/AlHabibMedicalService/health_calculator/ideal_body/ideal_body_result_page.dart +++ b/lib/pages/AlHabibMedicalService/health_calculator/ideal_body/ideal_body_result_page.dart @@ -214,7 +214,7 @@ class IdealBodyResult extends StatelessWidget { BariatricsService service = new BariatricsService(); List doctorsList = []; - List _patientDoctorAppointmentListHospital =[]; + List _patientDoctorAppointmentListHospital = []; service.getCalculationDoctors(calculationID: 4).then((res) { GifLoaderDialogUtils.hideDialog(context); @@ -253,7 +253,15 @@ class IdealBodyResult extends StatelessWidget { } }); - Navigator.push(context, FadePage(page: SearchResults(isLiveCareAppointment: false, doctorsList: doctorsList, patientDoctorAppointmentListHospital: _patientDoctorAppointmentListHospital))); + Navigator.push( + context, + FadePage( + page: SearchResults( + isLiveCareAppointment: false, + doctorsList: doctorsList, + patientDoctorAppointmentListHospital: _patientDoctorAppointmentListHospital, + isDoctorSearchResult: false, + ))); } } }).catchError((err) { diff --git a/lib/pages/AlHabibMedicalService/health_calculator/ovulation_period/ovulation_result_page.dart b/lib/pages/AlHabibMedicalService/health_calculator/ovulation_period/ovulation_result_page.dart index 300e96fa..8af51a3d 100644 --- a/lib/pages/AlHabibMedicalService/health_calculator/ovulation_period/ovulation_result_page.dart +++ b/lib/pages/AlHabibMedicalService/health_calculator/ovulation_period/ovulation_result_page.dart @@ -186,7 +186,7 @@ class OvulationResult extends StatelessWidget { } }); - Navigator.push(context, FadePage(page: SearchResults(isLiveCareAppointment: false, doctorsList: doctorsList, patientDoctorAppointmentListHospital: _patientDoctorAppointmentListHospital))); + Navigator.push(context, FadePage(page: SearchResults(isLiveCareAppointment: false, doctorsList: doctorsList, patientDoctorAppointmentListHospital: _patientDoctorAppointmentListHospital, isDoctorSearchResult: false,))); } } }).catchError((err) { diff --git a/lib/pages/BookAppointment/DentalComplaints.dart b/lib/pages/BookAppointment/DentalComplaints.dart index 7617f23a..44546b11 100644 --- a/lib/pages/BookAppointment/DentalComplaints.dart +++ b/lib/pages/BookAppointment/DentalComplaints.dart @@ -27,7 +27,7 @@ class DentalComplaints extends StatefulWidget { Function? onSelectedMethod; bool isDoctorNameSearch; - DentalComplaints({required this.searchInfo, this.onSelectedMethod, this.isDoctorNameSearch = false}); + DentalComplaints({required this.searchInfo, this.onSelectedMethod, this.isDoctorNameSearch = false}); @override _DentalComplaintsState createState() => _DentalComplaintsState(); @@ -243,8 +243,12 @@ class _DentalComplaintsState extends State { if (doctorByHospital.length != 0) { patientDoctorAppointmentListHospital[patientDoctorAppointmentListHospital.indexOf(doctorByHospital[0])].patientDoctorAppointmentList!.add(element); } else { - patientDoctorAppointmentListHospital - .add(PatientDoctorAppointmentList(filterName: element.projectName, distanceInKMs: element.projectDistanceInKiloMeters.toString(), patientDoctorAppointment: element)); + patientDoctorAppointmentListHospital.add(PatientDoctorAppointmentList( + filterName: element.projectName, + distanceInKMs: element.projectDistanceInKiloMeters.toString(), + projectTopName: element.projectTopName, + projectBottomName: element.projectBottomName, + patientDoctorAppointment: element)); } }); } else {} diff --git a/lib/pages/BookAppointment/SearchResults.dart b/lib/pages/BookAppointment/SearchResults.dart index cf2a850a..12cff848 100644 --- a/lib/pages/BookAppointment/SearchResults.dart +++ b/lib/pages/BookAppointment/SearchResults.dart @@ -17,6 +17,7 @@ class SearchResults extends StatelessWidget { bool isObGyneAppointment; bool isDoctorNameSearch; OBGyneProcedureListResponse? obGyneProcedureListResponse; + bool isDoctorSearchResult; SearchResults( {required this.doctorsList, @@ -24,6 +25,7 @@ class SearchResults extends StatelessWidget { this.isObGyneAppointment = false, this.isDoctorNameSearch = false, required this.isLiveCareAppointment, + required this.isDoctorSearchResult, this.obGyneProcedureListResponse}); @override @@ -50,7 +52,16 @@ class SearchResults extends StatelessWidget { title: (patientDoctorAppointmentListHospital[index].distanceInKMs != "0") ? patientDoctorAppointmentListHospital[index].filterName! + " - " + patientDoctorAppointmentListHospital[index].distanceInKMs! + " " + TranslationBase.of(context).km : patientDoctorAppointmentListHospital[index].filterName, + projectTitleTop: patientDoctorAppointmentListHospital[index].projectTopName, + projectTitleBottom: (patientDoctorAppointmentListHospital[index].distanceInKMs != "0") + ? patientDoctorAppointmentListHospital[index].projectBottomName.toString() + + " - " + + patientDoctorAppointmentListHospital[index].distanceInKMs! + + " " + + TranslationBase.of(context).km + : patientDoctorAppointmentListHospital[index].projectBottomName.toString(), isTitleSingleLine: false, + isDoctorSearchResult: isDoctorSearchResult, isExpand: patientDoctorAppointmentListHospital.length == 1 ? true : false, bodyWidget: ListView.separated( shrinkWrap: true, diff --git a/lib/pages/BookAppointment/components/LaserClinic.dart b/lib/pages/BookAppointment/components/LaserClinic.dart index 17c63b09..a4fc5117 100644 --- a/lib/pages/BookAppointment/components/LaserClinic.dart +++ b/lib/pages/BookAppointment/components/LaserClinic.dart @@ -211,7 +211,7 @@ class _LaserClinicState extends State with SingleTickerProviderStat List arrDistance = []; List result; int numAll; - List _patientDoctorAppointmentListHospital =[]; + List _patientDoctorAppointmentListHospital = []; DoctorsListService service = new DoctorsListService(); projectViewModel.selectedBodyPartList = _selectedBodyPartList; @@ -234,8 +234,12 @@ class _LaserClinicState extends State with SingleTickerProviderStat if (doctorByHospital.length != 0) { _patientDoctorAppointmentListHospital[_patientDoctorAppointmentListHospital.indexOf(doctorByHospital[0])].patientDoctorAppointmentList!.add(element); } else { - _patientDoctorAppointmentListHospital - .add(PatientDoctorAppointmentList(filterName: element.projectName, distanceInKMs: element.projectDistanceInKiloMeters.toString(), patientDoctorAppointment: element)); + _patientDoctorAppointmentListHospital.add(PatientDoctorAppointmentList( + filterName: element.projectName, + distanceInKMs: element.projectDistanceInKiloMeters.toString(), + projectTopName: element.projectTopName, + projectBottomName: element.projectBottomName, + patientDoctorAppointment: element)); } }); } else {} @@ -256,7 +260,7 @@ class _LaserClinicState extends State with SingleTickerProviderStat } Future navigateToSearchResults(context, List docList, List patientDoctorAppointmentListHospital) async { - Navigator.push(context, FadePage(page: SearchResults(isLiveCareAppointment: false, doctorsList: docList, patientDoctorAppointmentListHospital: patientDoctorAppointmentListHospital))) + Navigator.push(context, FadePage(page: SearchResults(isLiveCareAppointment: false, doctorsList: docList, patientDoctorAppointmentListHospital: patientDoctorAppointmentListHospital, isDoctorSearchResult: true,))) .then((value) { setState(() { // dropdownValue = null; diff --git a/lib/pages/BookAppointment/components/SearchByClinic.dart b/lib/pages/BookAppointment/components/SearchByClinic.dart index a113e81b..158f2c49 100644 --- a/lib/pages/BookAppointment/components/SearchByClinic.dart +++ b/lib/pages/BookAppointment/components/SearchByClinic.dart @@ -657,8 +657,12 @@ class _SearchByClinicState extends State { if (doctorByHospital.length != 0) { _patientDoctorAppointmentListHospital[_patientDoctorAppointmentListHospital.indexOf(doctorByHospital[0])].patientDoctorAppointmentList!.add(element); } else { - _patientDoctorAppointmentListHospital - .add(PatientDoctorAppointmentList(filterName: element.getProjectCompleteName(), distanceInKMs: element.projectDistanceInKiloMeters.toString(), patientDoctorAppointment: element)); + _patientDoctorAppointmentListHospital.add(PatientDoctorAppointmentList( + filterName: element.getProjectCompleteName(), + distanceInKMs: element.projectDistanceInKiloMeters.toString(), + projectTopName: element.projectTopName ?? "", + projectBottomName: element.projectBottomName ?? "", + patientDoctorAppointment: element)); } }); } else {} @@ -707,7 +711,7 @@ class _SearchByClinicState extends State { Future navigateToSearchResults(context, List docList, List patientDoctorAppointmentListHospital) async { isProjectLoaded = false; - Navigator.push(context, FadePage(page: SearchResults(isLiveCareAppointment: false, doctorsList: docList, patientDoctorAppointmentListHospital: patientDoctorAppointmentListHospital))) + Navigator.push(context, FadePage(page: SearchResults(isLiveCareAppointment: false, doctorsList: docList, patientDoctorAppointmentListHospital: patientDoctorAppointmentListHospital, isDoctorSearchResult: true,))) .then((value) { setState(() { dropdownValue = "null"; diff --git a/lib/pages/BookAppointment/components/SearchByDoctor.dart b/lib/pages/BookAppointment/components/SearchByDoctor.dart index bc17a2ca..7c093958 100644 --- a/lib/pages/BookAppointment/components/SearchByDoctor.dart +++ b/lib/pages/BookAppointment/components/SearchByDoctor.dart @@ -93,7 +93,7 @@ class _SearchByDoctorState extends State { List doctorsList = []; DoctorsListService service = new DoctorsListService(); - List _patientDoctorAppointmentListHospital =[]; + List _patientDoctorAppointmentListHospital = []; service.getDoctorsListByName(doctorNameController.text, languageID, context).then((res) { // GifLoaderDialogUtils.hideDialog(context); @@ -105,13 +105,18 @@ class _SearchByDoctorState extends State { }); doctorsList.forEach((element) { - List doctorByHospital = _patientDoctorAppointmentListHospital.where((elementClinic) => elementClinic.filterName == element.getProjectCompleteName()).toList(); + List doctorByHospital = + _patientDoctorAppointmentListHospital.where((elementClinic) => elementClinic.filterName == element.getProjectCompleteName()).toList(); if (doctorByHospital.length != 0) { _patientDoctorAppointmentListHospital[_patientDoctorAppointmentListHospital.indexOf(doctorByHospital[0])].patientDoctorAppointmentList!.add(element); } else { - _patientDoctorAppointmentListHospital - .add(PatientDoctorAppointmentList(filterName: element.getProjectCompleteName(), distanceInKMs: element.projectDistanceInKiloMeters.toString(), patientDoctorAppointment: element)); + _patientDoctorAppointmentListHospital.add(PatientDoctorAppointmentList( + filterName: element.getProjectCompleteName(), + distanceInKMs: element.projectDistanceInKiloMeters.toString(), + projectTopName: element.projectTopName, + projectBottomName: element.projectBottomName, + patientDoctorAppointment: element)); } }); } else { @@ -152,7 +157,8 @@ class _SearchByDoctorState extends State { } navigateToSearchResults(context, List docList, List patientDoctorAppointmentListHospital) { - Navigator.push(context, FadePage(page: SearchResults(isLiveCareAppointment: false, isDoctorNameSearch: true, doctorsList: docList, patientDoctorAppointmentListHospital: patientDoctorAppointmentListHospital))); + Navigator.push(context, + FadePage(page: SearchResults(isLiveCareAppointment: false, isDoctorNameSearch: true, doctorsList: docList, patientDoctorAppointmentListHospital: patientDoctorAppointmentListHospital, isDoctorSearchResult: true,))); } Widget inputWidget(String _labelText, String _hintText, TextEditingController _controller, {String? prefix, bool isEnable = true, bool hasSelection = false}) { diff --git a/lib/pages/BookAppointment/components/search_by_hospital_name.dart b/lib/pages/BookAppointment/components/search_by_hospital_name.dart index 72503cb4..5d0d9f9c 100644 --- a/lib/pages/BookAppointment/components/search_by_hospital_name.dart +++ b/lib/pages/BookAppointment/components/search_by_hospital_name.dart @@ -475,6 +475,7 @@ class _SearchByHospitalState extends State { page: SearchResults( isLiveCareAppointment: false, doctorsList: docList, + isDoctorSearchResult: false, patientDoctorAppointmentListHospital: patientDoctorAppointmentListHospital))) .then((value) { diff --git a/lib/pages/BookAppointment/widgets/DentalComplaintCard.dart b/lib/pages/BookAppointment/widgets/DentalComplaintCard.dart index 765e83fa..8f18a016 100644 --- a/lib/pages/BookAppointment/widgets/DentalComplaintCard.dart +++ b/lib/pages/BookAppointment/widgets/DentalComplaintCard.dart @@ -64,7 +64,7 @@ class _DentalComplaintCardState extends State { getChiefComplaintsList() { int languageID = Provider.of(context, listen: false).isArabic ? 1 : 2; List doctorsList = []; - List _patientDoctorAppointmentListHospital =[]; + List _patientDoctorAppointmentListHospital = []; GifLoaderDialogUtils.showMyDialog(context); ClinicListService service = new ClinicListService(); @@ -88,8 +88,12 @@ class _DentalComplaintCardState extends State { if (doctorByHospital.length != 0) { _patientDoctorAppointmentListHospital[_patientDoctorAppointmentListHospital.indexOf(doctorByHospital[0])].patientDoctorAppointmentList!.add(element); } else { - _patientDoctorAppointmentListHospital - .add(PatientDoctorAppointmentList(filterName: element.projectName, distanceInKMs: element.projectDistanceInKiloMeters.toString(), patientDoctorAppointment: element)); + _patientDoctorAppointmentListHospital.add(PatientDoctorAppointmentList( + filterName: element.projectName, + distanceInKMs: element.projectDistanceInKiloMeters.toString(), + projectTopName: element.projectTopName, + projectBottomName: element.projectBottomName, + patientDoctorAppointment: element)); } }); navigateToSearchResults(context, doctorsList, _patientDoctorAppointmentListHospital); @@ -104,6 +108,6 @@ class _DentalComplaintCardState extends State { } Future navigateToSearchResults(context, List docList, List patientDoctorAppointmentListHospital) async { - Navigator.push(context, FadePage(page: SearchResults(doctorsList: docList, patientDoctorAppointmentListHospital: patientDoctorAppointmentListHospital, isLiveCareAppointment: false))); + Navigator.push(context, FadePage(page: SearchResults(doctorsList: docList, patientDoctorAppointmentListHospital: patientDoctorAppointmentListHospital, isLiveCareAppointment: false, isDoctorSearchResult: true,))); } } diff --git a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInBookAppointment.dart b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInBookAppointment.dart index b5da50d5..946f6003 100644 --- a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInBookAppointment.dart +++ b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInBookAppointment.dart @@ -85,7 +85,7 @@ class _EROnlineCheckInBookAppointmentState extends State( value: item, - child: new Text(item.name!), + child: new Text(item.name! + " - " + item.distanceInKilometers.toString() + " " + TranslationBase.of(context).km), ); }).toList(), onChanged: (newValue) async { diff --git a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart index 307eceb6..bca3a0b0 100644 --- a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart +++ b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart @@ -8,6 +8,7 @@ import 'package:diplomaticquarterapp/services/clinic_services/get_clinic_service 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/location_util.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/utils_new.dart'; import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart'; @@ -31,8 +32,11 @@ class _EROnlineCheckInHomePageState extends State with bool _supportsNFC = false; bool isPatientArrived = false; + late LocationUtils locationUtils; + @override void initState() { + locationUtils = new LocationUtils(isShowConfirmDialog: true, context: context); WidgetsBinding.instance.addPostFrameCallback((_) { // checkIfPatientHasArrived(); if (projectViewModel.isLogin) checkPatientERAdvanceBalance(); @@ -436,6 +440,7 @@ class _EROnlineCheckInHomePageState extends State with } void checkPatientERAdvanceBalance() { + locationUtils.getCurrentLocation(); GifLoaderDialogUtils.showMyDialog(context); ClinicListService ancillaryOrdersService = new ClinicListService(); ancillaryOrdersService.checkPatientERAdvanceBalance(10).then((response) { diff --git a/lib/pages/ToDoList/ToDo.dart b/lib/pages/ToDoList/ToDo.dart index c225987c..bd860008 100644 --- a/lib/pages/ToDoList/ToDo.dart +++ b/lib/pages/ToDoList/ToDo.dart @@ -902,6 +902,7 @@ class _ToDoState extends State with SingleTickerProviderStateMixin { isLiveCareAppointment: false, isObGyneAppointment: true, doctorsList: docList, + isDoctorSearchResult: false, patientDoctorAppointmentListHospital: patientDoctorAppointmentListHospital, obGyneProcedureListResponse: obGyneProcedureListResponse))); } diff --git a/lib/pages/landing/fragments/home_page_fragment2.dart b/lib/pages/landing/fragments/home_page_fragment2.dart index d0c32fca..d01554ea 100644 --- a/lib/pages/landing/fragments/home_page_fragment2.dart +++ b/lib/pages/landing/fragments/home_page_fragment2.dart @@ -57,10 +57,12 @@ class _HomePageFragment2State extends State { hmgServices.add(HmgServices(1, TranslationBase.of(context).liveCare, TranslationBase.of(context).onlineConsulting, "assets/images/new/Live_Care.svg", isLogin)); projectViewModel.isIndoorNavigationEnabled - ? hmgServices.add(HmgServices(2, TranslationBase.of(context).hospitalNavigationTitle, TranslationBase.of(context).hospitalNavigationSubtitle, "assets/images/new/indoor_nav_home.svg", isLogin)) + ? hmgServices.add(HmgServices(2, TranslationBase.of(context).hospitalNavigationTitle, TranslationBase.of(context).hospitalNavigationSubtitle, "assets/images/new/indoor_nav_home.svg", isLogin, + isLocked: !projectViewModel.havePrivilege(107))) : hmgServices.add(HmgServices(2, TranslationBase.of(context).emergencyTitle, TranslationBase.of(context).emergencySubtitle, "assets/images/new/emergency.svg", isLogin)); - hmgServices.add(HmgServices(9, TranslationBase.of(context).emergency, TranslationBase.of(context).checkinOptions, "assets/images/new/emergency.svg", isLogin)); + hmgServices.add( + HmgServices(9, TranslationBase.of(context).emergency, TranslationBase.of(context).checkinOptions, "assets/images/new/emergency.svg", isLogin, isLocked: !projectViewModel.havePrivilege(108))); hmgServices.add(HmgServices(3, TranslationBase.of(context).hhcHome, TranslationBase.of(context).healthCare, "assets/images/new/HHC.svg", isLogin)); hmgServices.add(HmgServices(4, TranslationBase.of(context).checkup, TranslationBase.of(context).comprehensive, "assets/images/new/comprehensive_checkup.svg", isLogin)); hmgServices.add(HmgServices(5, TranslationBase.of(context).online, TranslationBase.of(context).payment, "assets/images/new/paymentMethods.png", isLogin)); @@ -76,10 +78,12 @@ class _HomePageFragment2State extends State { // hmgServices.add(new HmgServices(2, TranslationBase.of(context).online, TranslationBase.of(context).payment, "assets/images/new/paymentMethods.png", isLogin)); projectViewModel.isIndoorNavigationEnabled - ? hmgServices.add(HmgServices(2, TranslationBase.of(context).hospitalNavigationTitle, TranslationBase.of(context).hospitalNavigationSubtitle, "assets/images/new/indoor_nav_home.svg", isLogin)) + ? hmgServices.add(HmgServices(2, TranslationBase.of(context).hospitalNavigationTitle, TranslationBase.of(context).hospitalNavigationSubtitle, "assets/images/new/indoor_nav_home.svg", isLogin, + isLocked: !projectViewModel.havePrivilege(107))) : hmgServices.add(HmgServices(2, TranslationBase.of(context).emergencyTitle, TranslationBase.of(context).emergencySubtitle, "assets/images/new/emergency.svg", isLogin)); - hmgServices.add(new HmgServices(9, TranslationBase.of(context).emergency, TranslationBase.of(context).checkinOptions, "assets/images/new/emergency.svg", isLogin)); + hmgServices.add(new HmgServices(9, TranslationBase.of(context).emergency, TranslationBase.of(context).checkinOptions, "assets/images/new/emergency.svg", isLogin, + isLocked: !projectViewModel.havePrivilege(108))); hmgServices.add(new HmgServices(3, TranslationBase.of(context).hhcHome, TranslationBase.of(context).healthCare, "assets/images/new/HHC.svg", isLogin)); hmgServices.add(new HmgServices(4, TranslationBase.of(context).checkup, TranslationBase.of(context).comprehensive, "assets/images/new/comprehensive_checkup.svg", isLogin)); @@ -358,8 +362,9 @@ class _HomePageFragment2State extends State { itemCount: hmgServices.length, padding: EdgeInsets.zero, itemBuilder: (BuildContext context, int index) { - return ServicesView(hmgServices[index], index, true, projectViewModel, - isLocked: (hmgServices[index].action == 2 && projectViewModel.isIndoorNavigationEnabled) ? !projectViewModel.havePrivilege(107) : false); + // return ServicesView(hmgServices[index], index, true, projectViewModel, + // isLocked: (hmgServices[index].action == 2 && projectViewModel.isIndoorNavigationEnabled) ? !projectViewModel.havePrivilege(107) : false); + return ServicesView(hmgServices[index], index, true, projectViewModel, isLocked: hmgServices[index].isLocked); }, ), ), diff --git a/lib/pages/landing/widgets/services_view.dart b/lib/pages/landing/widgets/services_view.dart index a98da010..b336887e 100644 --- a/lib/pages/landing/widgets/services_view.dart +++ b/lib/pages/landing/widgets/services_view.dart @@ -258,7 +258,7 @@ class ServicesView extends StatelessWidget { Navigator.push(context, FadePage(page: InPatientServicesHome())); locator().hmgServices.logServiceName('find us reach us'); } else if (hmgServices.action == 9) { - Navigator.push(context, FadePage(page: EROnlineCheckInHomePage())); + if (!isLocked) Navigator.push(context, FadePage(page: EROnlineCheckInHomePage())); locator().hmgServices.logServiceName('ER Online CheckIn'); } } diff --git a/lib/pages/livecare/widgets/clinic_list.dart b/lib/pages/livecare/widgets/clinic_list.dart index 76d70885..0f98deb6 100644 --- a/lib/pages/livecare/widgets/clinic_list.dart +++ b/lib/pages/livecare/widgets/clinic_list.dart @@ -954,7 +954,8 @@ class _clinic_listState extends State { } Future navigateToSearchResults(context, List docList, List patientDoctorAppointmentListHospital) async { - Navigator.push(context, FadePage(page: SearchResults(doctorsList: docList, isLiveCareAppointment: false, patientDoctorAppointmentListHospital: patientDoctorAppointmentListHospital))); + Navigator.push(context, + FadePage(page: SearchResults(doctorsList: docList, isLiveCareAppointment: false, patientDoctorAppointmentListHospital: patientDoctorAppointmentListHospital, isDoctorSearchResult: false))); } updateSelectedIndex(PatientERGetClinicsList patientERGetClinicsList) { diff --git a/lib/pages/login/login.dart b/lib/pages/login/login.dart index 14ea9ab3..beb047f5 100644 --- a/lib/pages/login/login.dart +++ b/lib/pages/login/login.dart @@ -151,7 +151,7 @@ class _Login extends State { TranslationBase.of(context).login, () { if (isButtonDisabled) { - AppToast.showErrorToast(message: "National ID can only contain numbers"); + AppToast.showErrorToast(message: TranslationBase.of(context).incorrectNationalId, localContext: context); } else { this.startLogin(); } diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 862eb931..0f30731b 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -3020,6 +3020,7 @@ class TranslationBase { String get ERCheckInSuccess => localizedValues["ERCheckInSuccess"][locale.languageCode]; String get generalConsentTitle => localizedValues["generalConsentTitle"][locale.languageCode]; String get generalConsentSubTitle => localizedValues["generalConsentSubTitle"][locale.languageCode]; + String get incorrectNationalId => localizedValues["incorrectNationalId"][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/lib/widgets/in_app_browser/InAppBrowser.dart b/lib/widgets/in_app_browser/InAppBrowser.dart index 6f61ac8a..692dfd5c 100644 --- a/lib/widgets/in_app_browser/InAppBrowser.dart +++ b/lib/widgets/in_app_browser/InAppBrowser.dart @@ -38,9 +38,9 @@ class MyInAppBrowser extends InAppBrowser { static String APPLE_PAY_PAYFORT_URL = 'https://hmgwebservices.com/PayFortWebLive/PayFortApi/MakeApplePayRequest'; // Payfort Payment Gateway URL LIVE // static String APPLE_PAY_PAYFORT_URL = 'https://hmgwebservices.com/PayFortWebLive/PayFortApi/MakeApplePayRequest'; // Payfort Payment Gateway URL UAT - static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; // Payfort Payment Gateway URL UAT + // static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; // Payfort Payment Gateway URL UAT - // static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWebLive/pages/SendPayFortRequest.aspx'; //Payfort Payment Gateway URL LIVE + static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWebLive/pages/SendPayFortRequest.aspx'; //Payfort Payment Gateway URL LIVE // static String SERVICE_URL = 'https://uat.hmgwebservices.com/payfortforvidaplus/pages/SendPayFortRequest.aspx'; //Payfort Payment Gateway URL UAT VIDA PLUS @@ -343,7 +343,7 @@ class MyInAppBrowser extends InAppBrowser { form = form.replaceFirst('PROJECT_ID_VALUE', projId); form = form.replaceFirst('PAYMENT_OPTION_VALUE', paymentMethod); form = form.replaceFirst('LANG_VALUE', currentLanguageID); - form = form.replaceFirst('SERVICE_URL_VALUE', "https://mdlaboratories.com/tamara/Home/Checkout"); + form = form.replaceFirst('SERVICE_URL_VALUE', "https://mdlaboratories.com/tamaralive/Home/Checkout"); form = form.replaceFirst('INSTALLMENTS_VALUE', installments); form = form.replaceFirst('CUSTNATIONALID_VALUE', authUser.patientIdentificationNo!); diff --git a/lib/widgets/others/app_expandable_notifier.dart b/lib/widgets/others/app_expandable_notifier.dart index ef058f9b..8790d1b3 100644 --- a/lib/widgets/others/app_expandable_notifier.dart +++ b/lib/widgets/others/app_expandable_notifier.dart @@ -24,6 +24,9 @@ class AppExpandableNotifier extends StatefulWidget { var controller = new ExpandableController(); bool isTitleSingleLine; bool isDisabled = false; + bool isDoctorSearchResult = false; + final String? projectTitleTop; + final String? projectTitleBottom; AppExpandableNotifier( {this.headerWidget, @@ -35,13 +38,15 @@ class AppExpandableNotifier extends StatefulWidget { this.hasCounter = false, this.counter = "0", this.widgetColor = Colors.white, - this.isDisabled = false}); + this.isDisabled = false, + this.isDoctorSearchResult = false, + this.projectTitleTop = "", + this.projectTitleBottom = ""}); _AppExpandableNotifier createState() => _AppExpandableNotifier(); } class _AppExpandableNotifier extends State { - @override void initState() { setState(() { @@ -55,12 +60,19 @@ class _AppExpandableNotifier extends State { @override Widget build(BuildContext context) { - String _mainTitle = (widget.title ?? TranslationBase.of(context).details).trim(); - String _title = _mainTitle.contains(" ") ? (context.read().isArabic ? (_mainTitle.split(" ").length < 1 ? _mainTitle : _mainTitle.split(" ")[1]) : _mainTitle.split(" ")[0]) : _mainTitle; - // String _title = _mainTitle.split(" ")[0]; - String _subTitle = _mainTitle.replaceAll(_title, "").trim(); + String _title = ""; + String _subTitle = ""; + if (widget.isDoctorSearchResult) { + _title = widget.projectTitleTop ?? (context.read().isArabic ? (_mainTitle.split(" ").length < 1 ? _mainTitle : _mainTitle.split(" ")[1]) : _mainTitle.split(" ")[0]); + _subTitle = widget.projectTitleBottom ?? _mainTitle.replaceAll(_title, "").trim(); + } else { + _title = + _mainTitle.contains(" ") ? (context.read().isArabic ? (_mainTitle.split(" ").length < 1 ? _mainTitle : _mainTitle.split(" ")[1]) : _mainTitle.split(" ")[0]) : _mainTitle; + // String _title = _mainTitle.split(" ")[0]; + _subTitle = _mainTitle.replaceAll(_title, "").trim(); + } if (_subTitle.length < 1) { _subTitle = double.tryParse(_subTitle) != null ? _title : _title.toLowerCase().capitalizeFirstofEach; _title = ""; @@ -68,6 +80,7 @@ class _AppExpandableNotifier extends State { _subTitle = double.tryParse(_subTitle) == null ? _subTitle : _subTitle.toLowerCase().capitalizeFirstofEach; _title = double.tryParse(_subTitle) == null ? _title : _title.toLowerCase().capitalizeFirstofEach; } + return ExpandableNotifier( child: Container( color: widget.widgetColor != null ? widget.widgetColor : Colors.white, @@ -80,7 +93,7 @@ class _AppExpandableNotifier extends State { scrollOnExpand: true, scrollOnCollapse: false, child: ExpandablePanel( - // hasIcon: false, + // hasIcon: false, theme: const ExpandableThemeData( hasIcon: false, headerAlignment: ExpandablePanelHeaderAlignment.center, diff --git a/pubspec.yaml b/pubspec.yaml index c1b12fcb..53123f35 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: diplomaticquarterapp description: A new Flutter application. -version: 4.5.070+4050070 +version: 4.5.073+4050073 environment: sdk: ">=3.0.0 <3.13.0" From c58cbae99c8121536e0a2d800005e1625eb8061e Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 2 Dec 2024 18:04:41 +0300 Subject: [PATCH 15/31] InPatient prescription send email issue fixed --- .../request_send_prescription_email.dart | 7 ++++++- lib/core/service/medical/prescriptions_service.dart | 4 +++- .../viewModels/medical/prescriptions_view_model.dart | 4 ++-- .../prescriptions/prescription_items_page.dart | 11 +++++++---- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/lib/core/model/prescriptions/request_send_prescription_email.dart b/lib/core/model/prescriptions/request_send_prescription_email.dart index aff0e792..de162296 100644 --- a/lib/core/model/prescriptions/request_send_prescription_email.dart +++ b/lib/core/model/prescriptions/request_send_prescription_email.dart @@ -1,4 +1,5 @@ import 'package:diplomaticquarterapp/core/model/prescriptions/prescription_report.dart'; +import 'package:diplomaticquarterapp/core/model/prescriptions/prescription_report_inp.dart'; class RequestSendPrescriptionEmail { String? appointmentDate; @@ -26,6 +27,7 @@ class RequestSendPrescriptionEmail { int? doctorID; int? projectID; List? listPrescriptions; + List? listPrescriptionsINP; RequestSendPrescriptionEmail( {this.appointmentDate, @@ -102,9 +104,12 @@ class RequestSendPrescriptionEmail { data['PatientMobileNumber'] = this.patientMobileNumber; data['PatientName'] = this.patientName; data['SetupID'] = this.setupID; - if (this.listPrescriptions != null) { + if (this.listPrescriptions != null && this.listPrescriptions!.isNotEmpty) { data['ListPrescriptions'] = this.listPrescriptions!.map((v) => v.toJson()).toList(); } + if (this.listPrescriptionsINP != null && this.listPrescriptionsINP!.isNotEmpty) { + data['ListPrescriptions'] = this.listPrescriptionsINP!.map((v) => v.toJson()).toList(); + } data['ClinicName'] = this.clinicName; data['DoctorName'] = this.doctorName; data['ProjectID'] = this.projectID; diff --git a/lib/core/service/medical/prescriptions_service.dart b/lib/core/service/medical/prescriptions_service.dart index 71a24a39..c5b1a16f 100644 --- a/lib/core/service/medical/prescriptions_service.dart +++ b/lib/core/service/medical/prescriptions_service.dart @@ -98,6 +98,7 @@ class PrescriptionsService extends BaseService { await baseAppClient.post(prescriptions.isInOutPatient! ? GET_PRESCRIPTION_REPORT_ENH : GET_PRESCRIPTION_REPORT, onSuccess: (dynamic response, int statusCode) { prescriptionReportList.clear(); prescriptionReportEnhList.clear(); + prescriptionReportListINP.clear(); isMedDeliveryAllowed = response['IsHomeMedicineDeliverySupported']; if (prescriptions.isInOutPatient!) { response['ListPRM'].forEach((prescriptions) { @@ -120,8 +121,9 @@ class PrescriptionsService extends BaseService { isDentalAllowedBackend: false, ); - Future sendPrescriptionEmail(String appointmentDate, int patientID, String clinicName, String doctorName, int doctorID, int projectID) async { + Future sendPrescriptionEmail(String appointmentDate, int patientID, String clinicName, String doctorName, int doctorID, int projectID, bool isInOutPatient) async { _requestSendPrescriptionEmail.listPrescriptions = prescriptionReportList; + _requestSendPrescriptionEmail.listPrescriptionsINP = prescriptionReportListINP; _requestSendPrescriptionEmail.appointmentDate = appointmentDate; _requestSendPrescriptionEmail.patientID = patientID; _requestSendPrescriptionEmail.clinicName = clinicName; diff --git a/lib/core/viewModels/medical/prescriptions_view_model.dart b/lib/core/viewModels/medical/prescriptions_view_model.dart index a3816d92..8ad23b9b 100644 --- a/lib/core/viewModels/medical/prescriptions_view_model.dart +++ b/lib/core/viewModels/medical/prescriptions_view_model.dart @@ -114,9 +114,9 @@ class PrescriptionsViewModel extends BaseViewModel { } } - sendPrescriptionEmail({required String appointmentDate, required int patientID, required String clinicName, required String doctorName, required int doctorID, required String mes, required int projectID}) async { + sendPrescriptionEmail({required String appointmentDate, required int patientID, required String clinicName, required String doctorName, required int doctorID, required String mes, required int projectID, required bool isInOutPatient}) async { setState(ViewState.BusyLocal); - await _prescriptionsService.sendPrescriptionEmail(appointmentDate, patientID, clinicName, doctorName, doctorID, projectID); + await _prescriptionsService.sendPrescriptionEmail(appointmentDate, patientID, clinicName, doctorName, doctorID, projectID, isInOutPatient); if (_prescriptionsService.hasError) { error = _prescriptionsService.error!; setState(ViewState.ErrorLocal); diff --git a/lib/pages/medical/prescriptions/prescription_items_page.dart b/lib/pages/medical/prescriptions/prescription_items_page.dart index 58f1e7d6..5ff0a7d4 100644 --- a/lib/pages/medical/prescriptions/prescription_items_page.dart +++ b/lib/pages/medical/prescriptions/prescription_items_page.dart @@ -61,9 +61,11 @@ class PrescriptionItemsPage extends StatelessWidget { prescriptions.name!, DateUtil.convertStringToDate(prescriptions.appointmentDate!), DateUtil.formatDateToTime( - model.prescriptionReportEnhList.length > 0 || model.prescriptionReportListINP.length > 0 ? DateUtil.convertStringToDate( - model.prescriptionReportEnhList.length > 0 ? model.prescriptionReportEnhList[0].orderDate! : model.prescriptionReportListINP[0].orderDate!, - ) : DateTime.now(), + model.prescriptionReportEnhList.length > 0 || model.prescriptionReportListINP.length > 0 + ? DateUtil.convertStringToDate( + model.prescriptionReportEnhList.length > 0 ? model.prescriptionReportEnhList[0].orderDate! : model.prescriptionReportListINP[0].orderDate!, + ) + : DateTime.now(), ), prescriptions.nationalityFlagURL ?? "", prescriptions.doctorRate, @@ -433,7 +435,8 @@ class PrescriptionItemsPage extends StatelessWidget { doctorName: prescriptions.doctorName!, doctorID: prescriptions.doctorID!, mes: TranslationBase.of(context).sendSuc, - projectID: prescriptions.projectID!); + projectID: prescriptions.projectID!, + isInOutPatient: prescriptions.isInOutPatient!); }, ), ); From dff03796e9799d62a2cb33637b8c8283d8901d9b Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Tue, 3 Dec 2024 11:17:42 +0300 Subject: [PATCH 16/31] Crashlytics enabled --- lib/main.dart | 12 ++++++++++++ lib/splashPage.dart | 2 ++ pubspec.yaml | 1 + 3 files changed, 15 insertions(+) diff --git a/lib/main.dart b/lib/main.dart index a0a584a5..7bf71077 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -14,6 +14,8 @@ import 'package:diplomaticquarterapp/uitl/PlatformBridge.dart'; import 'package:diplomaticquarterapp/uitl/navigation_service.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:provider/provider.dart'; @@ -27,6 +29,16 @@ import 'pages/pharmacies/compare-list.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); + + // Pass all uncaught "fatal" errors from the framework to Crashlytics + FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterFatalError; + + // Pass all uncaught asynchronous errors that aren't handled by the Flutter framework to Crashlytics + PlatformDispatcher.instance.onError = (error, stack) { + FirebaseCrashlytics.instance.recordError(error, stack, fatal: true); + return true; + }; + setupLocator(); HttpOverrides.global = MyHttpOverrides(); runApp(MyApp()); diff --git a/lib/splashPage.dart b/lib/splashPage.dart index 515c7f54..7743cd73 100644 --- a/lib/splashPage.dart +++ b/lib/splashPage.dart @@ -11,6 +11,7 @@ import 'package:diplomaticquarterapp/uitl/LocalNotification.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/push-notification-handler.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_zoom_videosdk/native/zoom_videosdk.dart'; @@ -84,6 +85,7 @@ class _SplashScreenState extends State { // debugPrint("ALL SHARED PREFERENCES!!!!!"); // debugPrint(jsonEncode(value)); }); + await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); // PushNotificationHandler(context).init(); // Asyncronously } diff --git a/pubspec.yaml b/pubspec.yaml index 53123f35..7b43a711 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -183,6 +183,7 @@ dependencies: win32: ^5.5.4 cloudflare_turnstile: ^2.0.1 + firebase_crashlytics: ^3.0.0 dependency_overrides: From 849164be2ce77908de4533aa387b5f0c3c141514 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 16 Dec 2024 12:45:00 +0300 Subject: [PATCH 17/31] Laser appointment booking changes --- lib/pages/BookAppointment/DoctorProfile.dart | 15 +++ .../components/search_by_hospital_name.dart | 101 +++++------------- lib/pages/MyAppointments/MyAppointments.dart | 3 +- .../prescription_items_page.dart | 4 +- 4 files changed, 44 insertions(+), 79 deletions(-) diff --git a/lib/pages/BookAppointment/DoctorProfile.dart b/lib/pages/BookAppointment/DoctorProfile.dart index 1674c43d..77a7b74e 100644 --- a/lib/pages/BookAppointment/DoctorProfile.dart +++ b/lib/pages/BookAppointment/DoctorProfile.dart @@ -9,6 +9,8 @@ import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.da import 'package:diplomaticquarterapp/models/Clinics/ClinicListResponse.dart'; import 'package:diplomaticquarterapp/models/header_model.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/DentalComplaints.dart'; +import 'package:diplomaticquarterapp/pages/BookAppointment/LaserBooking.dart'; +import 'package:diplomaticquarterapp/pages/BookAppointment/components/LaserClinic.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/doctor_post_pre_images_page.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/waiting_appointment/waiting_appointment_info.dart'; import 'package:diplomaticquarterapp/pages/MyAppointments/SchedulePage.dart'; @@ -539,6 +541,8 @@ class _DoctorProfileState extends State with TickerProviderStateM if (projectViewModel.isLogin) { if (widget.isDoctorNameSearch && widget.doctor.clinicID == 17 && projectViewModel.user!.age! > 12) { navigateToDentalComplaints(context); + } else if (widget.isDoctorNameSearch && widget.doctor.clinicID == 253) { + navigateToLaserClinic(context); } else { final timeSlot = DocAvailableAppointments.selectedAppoDateTime; navigateToBookConfirm(context); @@ -560,6 +564,17 @@ class _DoctorProfileState extends State with TickerProviderStateM } } + Future navigateToLaserClinic(BuildContext context) async { + HospitalsModel tempselectedHospital = new HospitalsModel(); + tempselectedHospital.iD = widget.doctor.projectID; + Navigator.push( + context, + FadePage( + page: LaserClinic(selectedHospital: tempselectedHospital!), + ), + ); + } + Future navigateToDentalComplaints(BuildContext context) async { HospitalsModel selectedHospital = new HospitalsModel(); selectedHospital.name = widget.doctor.projectName; diff --git a/lib/pages/BookAppointment/components/search_by_hospital_name.dart b/lib/pages/BookAppointment/components/search_by_hospital_name.dart index 5d0d9f9c..34b82512 100644 --- a/lib/pages/BookAppointment/components/search_by_hospital_name.dart +++ b/lib/pages/BookAppointment/components/search_by_hospital_name.dart @@ -2,6 +2,7 @@ import 'dart:collection'; import 'package:auto_size_text/auto_size_text.dart'; import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/pages/BookAppointment/components/LaserClinic.dart'; import 'package:diplomaticquarterapp/theme/colors.dart'; import 'package:diplomaticquarterapp/uitl/utils_new.dart'; import 'package:flutter/material.dart'; @@ -118,15 +119,11 @@ class _SearchByHospitalState extends State { child: DropdownButtonHideUnderline( child: DropdownButton( key: projectDropdownKey, - hint: Text( - TranslationBase.of(context).selectHospital), + hint: Text(TranslationBase.of(context).selectHospital), value: selectedHospital, iconSize: 0, isExpanded: true, - style: TextStyle( - fontSize: 14, - letterSpacing: -0.56, - color: Colors.black), + style: TextStyle(fontSize: 14, letterSpacing: -0.56, color: Colors.black), items: projectsList.map((HospitalsModel item) { return DropdownMenuItem( value: item, @@ -164,29 +161,16 @@ class _SearchByHospitalState extends State { mHeight(8), InkWell( onTap: () { - showClickListDialog(context, clinicIds ?? List.empty(), - onSelection: (ListClinicCentralized clincs) { + showClickListDialog(context, clinicIds ?? List.empty(), onSelection: (ListClinicCentralized clincs) { selectedClinic = clincs; Navigator.pop(context); setState(() { dropdownTitle = clincs.clinicDescription!; - dropdownValue = clincs.clinicID.toString() + - "-" + - clincs.isLiveCareClinicAndOnline.toString() + - "-" + - clincs.liveCareClinicID.toString() + - "-" + - clincs.liveCareServiceID.toString(); + dropdownValue = clincs.clinicID.toString() + "-" + clincs.isLiveCareClinicAndOnline.toString() + "-" + clincs.liveCareClinicID.toString() + "-" + clincs.liveCareServiceID.toString(); }); getDoctorsList(context); - context - .read() - .analytics - .appointment - .book_appointment_select_clinic( - appointment_type: 'regular', - clinic: clincs.clinicDescription); + context.read().analytics.appointment.book_appointment_select_clinic(appointment_type: 'regular', clinic: clincs.clinicDescription); }); }, child: Container( @@ -302,8 +286,7 @@ class _SearchByHospitalState extends State { }); List clinicId = []; try { - Map res = await service.getClinicByHospital( - projectID: newValue?.mainProjectID.toString() ?? ""); + Map res = await service.getClinicByHospital(projectID: newValue?.mainProjectID.toString() ?? ""); GifLoaderDialogUtils.hideDialog(context); if (res['MessageStatus'] == 1) { List list = res['ListClinic']; @@ -376,8 +359,7 @@ class _SearchByHospitalState extends State { super.dispose(); } - Future navigateToDentalComplaints( - BuildContext context, SearchInfo searchInfo) async { + Future navigateToDentalComplaints(BuildContext context, SearchInfo searchInfo) async { Navigator.push( context, FadePage( @@ -401,20 +383,10 @@ class _SearchByHospitalState extends State { List arrDistance = []; List result; int numAll; - List _patientDoctorAppointmentListHospital = - []; + List _patientDoctorAppointmentListHospital = []; DoctorsListService service = new DoctorsListService(); - service - .getDoctorsList( - clinicID, - selectedHospital?.mainProjectID.toString() != "" - ? int.parse(selectedHospital?.mainProjectID.toString() ?? "-1") - : 0, - nearestAppo, - languageID, - null) - .then((res) { + service.getDoctorsList(clinicID, selectedHospital?.mainProjectID.toString() != "" ? int.parse(selectedHospital?.mainProjectID.toString() ?? "-1") : 0, nearestAppo, languageID, null).then((res) { GifLoaderDialogUtils.hideDialog(context); if (res['MessageStatus'] == 1) { setState(() { @@ -424,27 +396,17 @@ class _SearchByHospitalState extends State { doctorsList.add(DoctorList.fromJson(v)); }); doctorsList.forEach((element) { - List doctorByHospital = - _patientDoctorAppointmentListHospital - .where( - (elementClinic) => - elementClinic.filterName == element.getProjectCompleteName(), - ) - .toList(); + List doctorByHospital = _patientDoctorAppointmentListHospital + .where( + (elementClinic) => elementClinic.filterName == element.getProjectCompleteName(), + ) + .toList(); if (doctorByHospital.length != 0) { - _patientDoctorAppointmentListHospital[ - _patientDoctorAppointmentListHospital - .indexOf(doctorByHospital[0])] - .patientDoctorAppointmentList! - .add(element); + _patientDoctorAppointmentListHospital[_patientDoctorAppointmentListHospital.indexOf(doctorByHospital[0])].patientDoctorAppointmentList!.add(element); } else { - _patientDoctorAppointmentListHospital.add( - PatientDoctorAppointmentList( - filterName: element.getProjectCompleteName(), - distanceInKMs: - element.projectDistanceInKiloMeters.toString(), - patientDoctorAppointment: element)); + _patientDoctorAppointmentListHospital + .add(PatientDoctorAppointmentList(filterName: element.getProjectCompleteName(), distanceInKMs: element.projectDistanceInKiloMeters.toString(), patientDoctorAppointment: element)); } }); } else {} @@ -452,8 +414,7 @@ class _SearchByHospitalState extends State { result = LinkedHashSet.from(arr).toList(); numAll = result.length; - navigateToSearchResults( - context, doctorsList, _patientDoctorAppointmentListHospital); + navigateToSearchResults(context, doctorsList, _patientDoctorAppointmentListHospital); } else { AppToast.showErrorToast(message: res['ErrorEndUserMessage']); } @@ -464,20 +425,9 @@ class _SearchByHospitalState extends State { }); } - Future navigateToSearchResults( - context, - List docList, - List - patientDoctorAppointmentListHospital) async { - Navigator.push( - context, - FadePage( - page: SearchResults( - isLiveCareAppointment: false, - doctorsList: docList, - isDoctorSearchResult: false, - patientDoctorAppointmentListHospital: - patientDoctorAppointmentListHospital))) + Future navigateToSearchResults(context, List docList, List patientDoctorAppointmentListHospital) async { + Navigator.push(context, + FadePage(page: SearchResults(isLiveCareAppointment: false, doctorsList: docList, isDoctorSearchResult: false, patientDoctorAppointmentListHospital: patientDoctorAppointmentListHospital))) .then((value) { print("navigation return "); dropdownValue = null; @@ -493,7 +443,7 @@ class _SearchByHospitalState extends State { Navigator.push( context, FadePage( - page: LaserBooking(), + page: LaserClinic(selectedHospital: selectedHospital!), ), ).then((value) { print("LaserBooking navigation return "); @@ -534,10 +484,7 @@ class _SearchByHospitalState extends State { Navigator.push( context, FadePage( - page: LiveCareBookAppointment( - clinicName: dropdownTitle, - liveCareClinicID: dropdownValue!.split("-")[2], - liveCareServiceID: dropdownValue!.split("-")[3]), + page: LiveCareBookAppointment(clinicName: dropdownTitle, liveCareClinicID: dropdownValue!.split("-")[2], liveCareServiceID: dropdownValue!.split("-")[3]), ), ).then((value) { print("navigation return "); diff --git a/lib/pages/MyAppointments/MyAppointments.dart b/lib/pages/MyAppointments/MyAppointments.dart index d2bd25c3..44d06899 100644 --- a/lib/pages/MyAppointments/MyAppointments.dart +++ b/lib/pages/MyAppointments/MyAppointments.dart @@ -433,7 +433,8 @@ class _MyAppointmentsState extends State with SingleTickerProvid FadePage( page: AppointmentDetails( appo: _appointmentResult, - parentIndex: _currentPage, + // parentIndex: _currentPage, + parentIndex: _appointmentResult.patientStatusType == 42 ? 1 : 0, ), ), ).then((value) { diff --git a/lib/pages/medical/prescriptions/prescription_items_page.dart b/lib/pages/medical/prescriptions/prescription_items_page.dart index 5ff0a7d4..717037f2 100644 --- a/lib/pages/medical/prescriptions/prescription_items_page.dart +++ b/lib/pages/medical/prescriptions/prescription_items_page.dart @@ -436,7 +436,9 @@ class PrescriptionItemsPage extends StatelessWidget { doctorID: prescriptions.doctorID!, mes: TranslationBase.of(context).sendSuc, projectID: prescriptions.projectID!, - isInOutPatient: prescriptions.isInOutPatient!); + isInOutPatient: prescriptions.isInOutPatient! + + ); }, ), ); From 21403a2bbafe07a830a71eebc81719e9b5e3aa58 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Tue, 17 Dec 2024 11:13:39 +0300 Subject: [PATCH 18/31] InPatient Help PRO error handling issue resolved --- lib/pages/InPatientServices/help_PRO.dart | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/pages/InPatientServices/help_PRO.dart b/lib/pages/InPatientServices/help_PRO.dart index f5e8f6b4..61bd03c8 100644 --- a/lib/pages/InPatientServices/help_PRO.dart +++ b/lib/pages/InPatientServices/help_PRO.dart @@ -159,8 +159,13 @@ class _HelpPROState extends State { (projectViewModel.user.firstNameN! + " " + projectViewModel.user.lastNameN!), projectViewModel.user.mobileNumber!, assistText.text, context) .then((res) { GifLoaderDialogUtils.hideDialog(context); - AppToast.showSuccessToast(message: TranslationBase.of(context).successSendReport); - Navigator.of(context).pop(); + if (res['MessageStatus'] == 1) { + AppToast.showSuccessToast(message: TranslationBase.of(context).successSendReport); + Navigator.of(context).pop(); + } else { + AppToast.showErrorToast(message: res['ErrorEndUserMessage'], localContext: context); + Navigator.of(context).pop(); + } }).catchError((err) { GifLoaderDialogUtils.hideDialog(context); print(err); From cd7da0dd707ae604dc9e33d1c6fc688e422233f6 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Tue, 17 Dec 2024 11:31:57 +0300 Subject: [PATCH 19/31] Penguin SDK changes & crashlytics --- android/app/build.gradle | 1 + .../penguin/PenguinView.kt | 13 +++- lib/config/config.dart | 12 +-- lib/core/service/client/base_app_client.dart | 6 +- lib/main.dart | 15 ++-- .../new_Home_health_care_step_tow_page.dart | 78 +++++++------------ lib/splashPage.dart | 3 +- 7 files changed, 59 insertions(+), 69 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index f154f114..98c75fbe 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -58,6 +58,7 @@ android { buildFeatures { viewBinding true + dataBinding true } sourceSets { diff --git a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/penguin/PenguinView.kt b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/penguin/PenguinView.kt index 238765b2..9f74103f 100644 --- a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/penguin/PenguinView.kt +++ b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/penguin/PenguinView.kt @@ -204,6 +204,7 @@ internal class PenguinView( // .setDeepLinkData("deeplink") .setCustomizeColor("#2CA0AF") .setDeepLinkSchema("") + .setIsEnableReportIssue(true) .build() // Set location delegate to handle location updates @@ -215,7 +216,17 @@ internal class PenguinView( // } // Set events delegate for reporting issues - PlugAndPlaySDK.setPiEventsDelegate { } +// PlugAndPlaySDK.setPiEventsDelegate(new PIEventsDelegate() { +// @Override +// public void onReportIssue(PIReportIssue issue) { +// Log.e("Issue Reported: ", issue.getReportType()); +// } +// // Implement issue reporting logic here } +// @Override +// public void onSharedLocation(String link) { +// // Implement Shared location logic here +// } +// }) // Start the Penguin SDK PlugAndPlaySDK.start(mContext, this) diff --git a/lib/config/config.dart b/lib/config/config.dart index 648d52ae..e69f0510 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -22,7 +22,7 @@ var PACKAGES_ORDER_HISTORY = '/api/orders/items'; var PACKAGES_TAMARA_OPT = '/api/orders/paymentoptions/tamara'; // var BASE_URL = 'http://10.50.100.198:2018/'; // var BASE_URL = 'http://10.50.100.198:4422/'; -// var BASE_URL = 'https://uat.hmgwebservices.com/'; +var BASE_URL = 'https://uat.hmgwebservices.com/'; // var BASE_URL = 'https://hmgwebservices.com/'; // var BASE_URL = 'http://10.20.200.111:1010/'; // var BASE_URL = 'https://hmgwebservices.com/'; @@ -30,7 +30,7 @@ var PACKAGES_TAMARA_OPT = '/api/orders/paymentoptions/tamara'; // var BASE_URL = 'https://vidauat.cloudsolutions.com.sa/'; // var BASE_URL = 'https://vidamergeuat.cloudsolutions.com.sa/'; -var BASE_URL = 'https://webservices.hmg.com/'; +// var BASE_URL = 'https://webservices.hmg.com/'; // var BASE_URL = 'http://10.50.100.198:4422/'; @@ -698,10 +698,10 @@ var GET_PROJECT_FROM_NFC = 'Services/OUTPs.svc/Rest/GetProjectByNFC'; //PAYFORT var getPayFortProjectDetails = "Services/PayFort_Serv.svc/REST/GetPayFortProjectDetails"; var addPayFortApplePayResponse = "Services/PayFort_Serv.svc/REST/AddResponse"; -var payFortEnvironment = FortEnvironment.production; -var applePayMerchantId = "merchant.com.hmgwebservices"; -// var payFortEnvironment = FortEnvironment.test; -// var applePayMerchantId = "merchant.com.hmgwebservices.uat"; +// var payFortEnvironment = FortEnvironment.production; +// var applePayMerchantId = "merchant.com.hmgwebservices"; +var payFortEnvironment = FortEnvironment.test; +var applePayMerchantId = "merchant.com.hmgwebservices.uat"; class AppGlobal { static var context; diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index ac2c60ca..68593a1c 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -184,8 +184,8 @@ class BaseAppClient { // body['IdentificationNo'] = 1023854217; // body['MobileNo'] = "531940021"; //0560717232 - // body['PatientID'] = 4769791; //4609100 - // body['TokenID'] = "@dm!n"; + body['PatientID'] = 1231755; //4609100 + body['TokenID'] = "@dm!n"; // Patient ID: 3027574 // Mobile no.: 0502303285 @@ -195,7 +195,7 @@ class BaseAppClient { // if (url == 'https://uat.hmgwebservices.com/Services/NHIC.svc/REST/GetPatientInfo') { // url = "https://hmgwebservices.com/Services/NHIC.svc/REST/GetPatientInfo"; - // body['TokenID'] = "@dm!n"; + // body['TokenID'] = "@dm!n"; // } // if (AppGlobal.isNetworkDebugEnabled) { diff --git a/lib/main.dart b/lib/main.dart index 7bf71077..815bea40 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -35,12 +35,13 @@ void main() async { // Pass all uncaught asynchronous errors that aren't handled by the Flutter framework to Crashlytics PlatformDispatcher.instance.onError = (error, stack) { - FirebaseCrashlytics.instance.recordError(error, stack, fatal: true); + if (!kDebugMode) FirebaseCrashlytics.instance.recordError(error, stack, fatal: true); return true; }; setupLocator(); HttpOverrides.global = MyHttpOverrides(); + runApp(MyApp()); } @@ -67,8 +68,6 @@ class _MyApp extends State { //0567184134 mobile //246305493 - - // checkForUpdate() { // // todo need to verify 'imp' // InAppUpdate.checkForUpdate().then((info) { @@ -152,14 +151,12 @@ class _MyApp extends State { ], child: Consumer( builder: (context, projectProvider, child) => MaterialApp( - builder: (_, mchild) { return MediaQuery( - data: MediaQuery.of(context).copyWith( - textScaler: TextScaler.linear(1.0), - ), //set desired text scale factor here - child: mchild! - ); + data: MediaQuery.of(context).copyWith( + textScaler: TextScaler.linear(1.0), + ), //set desired text scale factor here + child: mchild!); // Container( // color: Colors.blue, // )); diff --git a/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_tow_page.dart b/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_tow_page.dart index dfccb11b..ee8f5b92 100644 --- a/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_tow_page.dart +++ b/lib/pages/AlHabibMedicalService/HomeHealthCare/NewHomeHealthCare/new_Home_health_care_step_tow_page.dart @@ -30,28 +30,18 @@ class NewHomeHealthCareStepTowPage extends StatefulWidget { final Function(PickResult)? onPick; final double? latitude; final double? longitude; - final PatientERInsertPresOrderRequestModel? - patientERInsertPresOrderRequestModel; + final PatientERInsertPresOrderRequestModel? patientERInsertPresOrderRequestModel; final Function? changePageViewIndex; final HomeHealthCareViewModel model; - const NewHomeHealthCareStepTowPage( - {Key? key, - this.onPick, - this.latitude, - this.longitude, - this.patientERInsertPresOrderRequestModel, - this.changePageViewIndex, - required this.model}) + const NewHomeHealthCareStepTowPage({Key? key, this.onPick, this.latitude, this.longitude, this.patientERInsertPresOrderRequestModel, this.changePageViewIndex, required this.model}) : super(key: key); @override - _NewHomeHealthCareStepTowPageState createState() => - _NewHomeHealthCareStepTowPageState(); + _NewHomeHealthCareStepTowPageState createState() => _NewHomeHealthCareStepTowPageState(); } -class _NewHomeHealthCareStepTowPageState - extends State { +class _NewHomeHealthCareStepTowPageState extends State { double latitude = 0; double longitude = 0; AddressInfo? _selectedAddress; @@ -88,8 +78,7 @@ class _NewHomeHealthCareStepTowPageState } void _getUserLocation() async { - if (await this.sharedPref.getDouble(USER_LAT) != null && - await this.sharedPref.getDouble(USER_LONG) != null) { + if (await this.sharedPref.getDouble(USER_LAT) != null && await this.sharedPref.getDouble(USER_LONG) != null) { var lat = await this.sharedPref.getDouble(USER_LAT); var long = await this.sharedPref.getDouble(USER_LONG); latitude = lat; @@ -97,8 +86,7 @@ class _NewHomeHealthCareStepTowPageState currentPostion = LatLng(lat, long); setMap(); } else { - locationUtils = - new LocationUtils(isShowConfirmDialog: true, context: context); + locationUtils = new LocationUtils(isShowConfirmDialog: true, context: context); locationUtils.getCurrentLocation(callBack: (value) { print(value); setMap(); @@ -138,8 +126,7 @@ class _NewHomeHealthCareStepTowPageState showCurrentLocation = true; }); } else { - latLong = widget - .model.addressesList[widget.model.addressesList.length - 1].latLong; + latLong = widget.model.addressesList[widget.model.addressesList.length - 1].latLong; } } @@ -178,8 +165,7 @@ class _NewHomeHealthCareStepTowPageState decoration: cardRadius(12), child: Container( child: InkWell( - onTap: () => - confirmSelectLocationDialog(widget.model.addressesList), + onTap: () => confirmSelectLocationDialog(widget.model.addressesList), child: Container( padding: EdgeInsets.all(8), width: double.infinity, @@ -212,28 +198,28 @@ class _NewHomeHealthCareStepTowPageState ), InkWell( onTap: () { - Navigator.push( - context, - FadePage( - page: LocationPage( - // latitude: latitude, - // longitude: longitude, - ), - ), - ).then((value) async { - print(value); - await widget.model.getCustomerAddresses(); - setState(() {}); - }); + // Navigator.push( + // context, + // FadePage( + // page: LocationPage( + // // latitude: latitude, + // // longitude: longitude, + // ), + // ), + // ).then((value) async { + // print(value); + // await widget.model.getCustomerAddresses(); + // setState(() {}); + // }); }, child: Padding( - padding: EdgeInsets.only(left: 12, right: 12, bottom: 16, top: 8), + padding: EdgeInsets.only(left: 12, right: 12, bottom: 16, top: 16), child: Row( children: [ - Icon(Icons.add_circle_outline_sharp), + Icon(Icons.location_on_outlined), mWidth(12), Text( - TranslationBase.of(context).addNewAddress, + TranslationBase.of(context).selectLocation, style: TextStyle( fontSize: 14, fontWeight: FontWeight.w600, @@ -261,23 +247,18 @@ class _NewHomeHealthCareStepTowPageState ), ), Padding( - padding: - const EdgeInsets.only(left: 20, right: 20, top: 14, bottom: 14), + padding: const EdgeInsets.only(left: 20, right: 20, top: 14, bottom: 14), child: DefaultButton( TranslationBase.of(context).continues, () { setState(() { - widget.patientERInsertPresOrderRequestModel!.latitude = - latitude; - widget.patientERInsertPresOrderRequestModel!.longitude = - longitude; + widget.patientERInsertPresOrderRequestModel!.latitude = latitude; + widget.patientERInsertPresOrderRequestModel!.longitude = longitude; }); - navigateTo( context, NewHomeHealthCareStepThreePage( - patientERInsertPresOrderRequestModel: - widget.patientERInsertPresOrderRequestModel, + patientERInsertPresOrderRequestModel: widget.patientERInsertPresOrderRequestModel, model: widget.model, ), ); @@ -319,8 +300,7 @@ class _NewHomeHealthCareStepTowPageState goToCurrentLocation() { Geolocator.getCurrentPosition().then((value) { - _selectedAddress = - AddressInfo(latLong: '${value.latitude},${value.longitude}'); + _selectedAddress = AddressInfo(latLong: '${value.latitude},${value.longitude}'); moveToLocation(LatLng(value.latitude, value.longitude)); }); } diff --git a/lib/splashPage.dart b/lib/splashPage.dart index 7743cd73..533456ee 100644 --- a/lib/splashPage.dart +++ b/lib/splashPage.dart @@ -12,6 +12,7 @@ import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/push-notification-handler.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_zoom_videosdk/native/zoom_videosdk.dart'; @@ -85,7 +86,7 @@ class _SplashScreenState extends State { // debugPrint("ALL SHARED PREFERENCES!!!!!"); // debugPrint(jsonEncode(value)); }); - await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); + if (!kDebugMode) await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); // PushNotificationHandler(context).init(); // Asyncronously } From cfcba179c4622ae28972aee1237070ee783002e5 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Tue, 17 Dec 2024 12:16:10 +0300 Subject: [PATCH 20/31] CR 7241 Lab result enhancement code merged --- lib/config/config.dart | 4 ++-- lib/config/localized_values.dart | 1 + lib/core/service/client/base_app_client.dart | 4 ++-- lib/uitl/translations_delegate_base.dart | 1 + .../data_display/medical/LabResult/LabResultWidget.dart | 9 +++++++-- lib/widgets/data_display/medical/doctor_card.dart | 4 ++-- 6 files changed, 15 insertions(+), 8 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index 5013e201..9e85e44b 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -21,8 +21,8 @@ var PACKAGES_ORDERS = '/api/orders'; var PACKAGES_ORDER_HISTORY = '/api/orders/items'; var PACKAGES_TAMARA_OPT = '/api/orders/paymentoptions/tamara'; // var BASE_URL = 'http://10.50.100.198:2018/'; - // var BASE_URL = 'https://uat.hmgwebservices.com/'; -var BASE_URL = 'https://hmgwebservices.com/'; + var BASE_URL = 'https://uat.hmgwebservices.com/'; +// var BASE_URL = 'https://hmgwebservices.com/'; // var BASE_URL = 'https://orash.cloudsolutions.com.sa/'; // var BASE_URL = 'https://vidauat.cloudsolutions.com.sa/'; // var BASE_URL = 'https://vidamergeuat.cloudsolutions.com.sa/'; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 741800a5..b62653f8 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -2118,4 +2118,5 @@ const Map localizedValues = { "لقد قرأت وفهمت وأوافق على الشروط والأحكام المبينة أعلاه وأوافق على الإلتزام بالمتطلبات المذكورة تجاه المستشفى ، لقد قرأت التفاصيل المبينة في نموذج التسجيل الخاص بي وأقر بأنها صحيحة. أنا الموقع ادناه أقر بأنه أتيحت لي الفرصة لطرح الأسئلة والتحفظات بشأن هذه الموافقة، وتلقيت إجابات مرضية على جميع إستفساراتي." }, "incorrectNationalId": {"en": "Incorrect National ID", "ar": "رقم الهوية غير صحيحة"}, + "labResultFlag": {"en": "Flag", "ar": "Flag"}, }; diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index 0ec508a0..68593a1c 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -184,8 +184,8 @@ class BaseAppClient { // body['IdentificationNo'] = 1023854217; // body['MobileNo'] = "531940021"; //0560717232 - // body['PatientID'] = 1231755; //4609100 - // body['TokenID'] = "@dm!n"; + body['PatientID'] = 1231755; //4609100 + body['TokenID'] = "@dm!n"; // Patient ID: 3027574 // Mobile no.: 0502303285 diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index d9fec44b..c7d32011 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -3022,6 +3022,7 @@ class TranslationBase { String get generalConsentSubTitle => localizedValues["generalConsentSubTitle"][locale.languageCode]; String get incorrectNationalId => localizedValues["incorrectNationalId"][locale.languageCode]; String get resultStatus => localizedValues["resultStatus"][locale.languageCode]; + String get labResultFlag => localizedValues["labResultFlag"][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart b/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart index 1bf7f045..019aafae 100644 --- a/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart +++ b/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart @@ -160,7 +160,8 @@ class LabResultWidget extends StatelessWidget { children: [ Utils.tableColumnTitle(TranslationBase.of(context).description, showDivider: false), Utils.tableColumnTitle(TranslationBase.of(context).value, showDivider: false), - Utils.tableColumnTitle(TranslationBase.of(context).unit, showDivider: false), + // Utils.tableColumnTitle(TranslationBase.of(context).unit, showDivider: false), + Utils.tableColumnTitle(TranslationBase.of(context).labResultFlag, showDivider: false), Utils.tableColumnTitle(TranslationBase.of(context).range, showDivider: false), ], ), @@ -187,7 +188,11 @@ class LabResultWidget extends StatelessWidget { ), Utils.tableColumnValue(labResultList[i].resultValue! + " " + labResultList[i].uOM!, isHighLow: (labResultList[i].resultValueFlag!.toLowerCase() == "h" || labResultList[i].resultValueFlag!.toLowerCase() == "l"), isLast: true, mProjectViewModel: projectViewModel), - Utils.tableColumnValue(labResultList[i].uOM!, isLast: true, isCapitable: false, mProjectViewModel: projectViewModel), + Utils.tableColumnValue(labResultList[i].resultValueFlag!, + isHighLow: (labResultList[i].resultValueFlag!.toLowerCase() == "h" || labResultList[i].resultValueFlag!.toLowerCase() == "l"), + isLast: true, + isCapitable: false, + mProjectViewModel: projectViewModel), !checkIfCovidLab(patientLabResultList!) ? InkWell( onTap: () { diff --git a/lib/widgets/data_display/medical/doctor_card.dart b/lib/widgets/data_display/medical/doctor_card.dart index 05cc66c6..ceddea82 100644 --- a/lib/widgets/data_display/medical/doctor_card.dart +++ b/lib/widgets/data_display/medical/doctor_card.dart @@ -245,8 +245,8 @@ class DoctorCard extends StatelessWidget { ), ], ), - if (isLabOrderResult) - MyRichText(TranslationBase.of(context).resultStatus, resultStatusDesc ?? "", projectViewModel.isArabic, valueColor: getResultStatusColor(resultStatus!)), + // if (isLabOrderResult) + // MyRichText(TranslationBase.of(context).resultStatus, resultStatusDesc ?? "", projectViewModel.isArabic, valueColor: getResultStatusColor(resultStatus!)), ], ), ), From 924c111771f11b1de19a0d3785ad21cf76673fee Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Tue, 17 Dec 2024 14:53:12 +0300 Subject: [PATCH 21/31] Lab result widget fixes --- .../data_display/medical/LabResult/LabResultWidget.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart b/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart index 019aafae..04b6259a 100644 --- a/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart +++ b/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart @@ -187,9 +187,9 @@ class LabResultWidget extends StatelessWidget { child: Utils.tableColumnValue(labResultList[i].description ?? "", isLast: true, mProjectViewModel: projectViewModel), ), Utils.tableColumnValue(labResultList[i].resultValue! + " " + labResultList[i].uOM!, - isHighLow: (labResultList[i].resultValueFlag!.toLowerCase() == "h" || labResultList[i].resultValueFlag!.toLowerCase() == "l"), isLast: true, mProjectViewModel: projectViewModel), - Utils.tableColumnValue(labResultList[i].resultValueFlag!, - isHighLow: (labResultList[i].resultValueFlag!.toLowerCase() == "h" || labResultList[i].resultValueFlag!.toLowerCase() == "l"), + isHighLow: ((labResultList[i].resultValueFlag ?? "").toLowerCase() == "h" || (labResultList[i].resultValueFlag ?? "").toLowerCase() == "l"), isLast: true, mProjectViewModel: projectViewModel), + Utils.tableColumnValue((labResultList[i].resultValueFlag ?? ""), + isHighLow: ((labResultList[i].resultValueFlag ?? "").toLowerCase() == "h" || (labResultList[i].resultValueFlag ?? "").toLowerCase() == "l"), isLast: true, isCapitable: false, mProjectViewModel: projectViewModel), From 545cfcd6d9460604b861dc0c488affaa47277729 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 18 Dec 2024 10:32:22 +0300 Subject: [PATCH 22/31] updates --- .../data_display/medical/LabResult/LabResultWidget.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart b/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart index 04b6259a..3eb9b86a 100644 --- a/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart +++ b/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart @@ -187,7 +187,9 @@ class LabResultWidget extends StatelessWidget { child: Utils.tableColumnValue(labResultList[i].description ?? "", isLast: true, mProjectViewModel: projectViewModel), ), Utils.tableColumnValue(labResultList[i].resultValue! + " " + labResultList[i].uOM!, - isHighLow: ((labResultList[i].resultValueFlag ?? "").toLowerCase() == "h" || (labResultList[i].resultValueFlag ?? "").toLowerCase() == "l"), isLast: true, mProjectViewModel: projectViewModel), + isHighLow: ((labResultList[i].resultValueFlag ?? "").toLowerCase() == "h" || (labResultList[i].resultValueFlag ?? "").toLowerCase() == "l"), + isLast: true, + mProjectViewModel: projectViewModel), Utils.tableColumnValue((labResultList[i].resultValueFlag ?? ""), isHighLow: ((labResultList[i].resultValueFlag ?? "").toLowerCase() == "h" || (labResultList[i].resultValueFlag ?? "").toLowerCase() == "l"), isLast: true, From baa7790b899b0ac3261dcf86f7b9555303b4234e Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 18 Dec 2024 18:23:37 +0300 Subject: [PATCH 23/31] Patient occupation selection implemented --- lib/config/config.dart | 2 + lib/config/localized_values.dart | 2 + lib/config/shared_pref_kay.dart | 1 + lib/core/service/client/base_app_client.dart | 14 +- .../get_patient_occupation_list_response.dart | 22 +++ .../register_info_response.dart | 6 +- .../Authentication/register_user_requet.dart | 13 +- lib/pages/login/register-info.dart | 147 ++++++++++++++++-- lib/pages/login/register.dart | 31 +++- .../authentication/auth_provider.dart | 18 +++ lib/uitl/translations_delegate_base.dart | 2 + 11 files changed, 236 insertions(+), 22 deletions(-) create mode 100644 lib/models/Authentication/get_patient_occupation_list_response.dart diff --git a/lib/config/config.dart b/lib/config/config.dart index 9e85e44b..9f093c9d 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -692,6 +692,8 @@ var CHECK_PATIENT_ER_ADVANCE_BALANCE = 'Services/OUTPs.svc/Rest/getPatientAdvanc var GET_PROJECT_FROM_NFC = 'Services/OUTPs.svc/Rest/GetProjectByNFC'; +var GET_PATIENT_OCCUPATION_LIST = 'Services/Authentication.svc/REST/GetPatientOccupation'; + //PAYFORT var getPayFortProjectDetails = "Services/PayFort_Serv.svc/REST/GetPayFortProjectDetails"; var addPayFortApplePayResponse = "Services/PayFort_Serv.svc/REST/AddResponse"; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index b62653f8..348eade4 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -2119,4 +2119,6 @@ const Map localizedValues = { }, "incorrectNationalId": {"en": "Incorrect National ID", "ar": "رقم الهوية غير صحيحة"}, "labResultFlag": {"en": "Flag", "ar": "Flag"}, + "selectOccupation": {"en": "Select Occupation", "ar": "اختر المهنة"}, + "selectOccupationError": {"en": "Please select your occupation.", "ar": "الرجاء تحديد مهنتك."}, }; diff --git a/lib/config/shared_pref_kay.dart b/lib/config/shared_pref_kay.dart index f92841e3..07295d75 100644 --- a/lib/config/shared_pref_kay.dart +++ b/lib/config/shared_pref_kay.dart @@ -44,3 +44,4 @@ const COVID_QA_LIST = 'COVID_QA_LIST'; const IS_COVID_CONSENT_SHOWN = 'IS_COVID_CONSENT_SHOWN'; const REGISTER_INFO_DUBAI ='register-info-dubai'; const IS_LAST_APPOINTMENT_RATE_SHOWN ='is-last-appointment-rate-shown'; +const PATIENT_OCCUPATION_LIST ='patient-occupation-list'; diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index 68593a1c..2f836dbf 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -37,6 +37,9 @@ VitalSignService _vitalSignService = locator(); class BaseAppClient { final _analytics = locator(); + var sampleNHICResponse = + '{"Date":null,"LanguageID":0,"ServiceName":0,"Time":null,"AndroidLink":null,"AuthenticationTokenID":null,"Data":null,"Dataw":false,"DietType":0,"DietTypeID":0,"ErrorCode":null,"ErrorEndUserMessage":null,"ErrorEndUserMessageN":null,"ErrorMessage":null,"ErrorStatusCode":0,"ErrorType":0,"FoodCategory":0,"IOSLink":null,"IsAuthenticated":false,"MealOrderStatus":0,"MealType":0,"MessageStatus":1,"NumberOfResultRecords":0,"PatientBlodType":null,"SuccessMsg":null,"SuccessMsgN":null,"VidaUpdatedResponse":null,"AccessTokenObject":null,"Age":23,"ClientIdentifierId":null,"CreatedBy":0,"DateOfBirth":"05\/20\/2001","FirstNameAr":"عميرخان","FirstNameEn":"UMAIR KHAN","Gender":"M","GenderAr":null,"GenderEn":null,"HealthId":"30000411002276","IdNumber":"2188030163","IdType":"Iqama","IsHijri":false,"IsInstertedOrUpdated":0,"IsNull":0,"IsPatientExistNHIC":0,"IsRecordLockedByCurrentUser":false,"LastNameAr":"خان","LastNameEn":"KHAN","List_ActiveAccessToken":null,"MaritalStatus":"غير معروف","MaritalStatusCode":"U","NationalDateOfBirth":"26\/02\/1422","Nationality":"باكستان","NationalityCode":"PAK","Occupation":"-","PCDTransactionDataResultList":null,"PCD_GetVidaPatientForManualVerificationList":null,"PCD_NHIC_HMG_PatientDetailsMatchCalulationList":null,"PCD_ReturnValue":0,"PatientStatus":"-","PlaceofBirth":"-","PractitionerStatusCode":null,"PractitionerStatusDescAr":null,"PractitionerStatusDescEn":null,"RowCount":0,"SecondNameAr":"عظيم","SecondNameEn":"AZEEM","ThirdNameAr":"خان عمر","ThirdNameEn":"KHAN UMAR","YakeenDoctorData_GetSourceList":null,"YakeenVidaPatientDataStatisticsByPatientIdList":null,"YakeenVidaPatientDataStatisticsList":null,"YakeenVidaPatientDataStatisticsPrefferedList":null,"accessToken":null,"categoryCode":0,"categoryNameAr":null,"categoryNameEn":null,"constraintCode":0,"constraintNameAr":null,"constraintNameEn":null,"content":null,"errorList":null,"licenseExpiryDate":null,"licenseIssuedDate":null,"licenseStatusCode":null,"licenseStatusDescAr":null,"licenseStatusDescEn":null,"organizations":null,"registrationNumber":null,"specialtyCode":0,"specialtyNameAr":null,"specialtyNameEn":null}'; + post(String endPoint, {required Map body, required Function(dynamic response, int statusCode) onSuccess, @@ -184,8 +187,8 @@ class BaseAppClient { // body['IdentificationNo'] = 1023854217; // body['MobileNo'] = "531940021"; //0560717232 - body['PatientID'] = 1231755; //4609100 - body['TokenID'] = "@dm!n"; + // body['PatientID'] = 1231755; //4609100 + // body['TokenID'] = "@dm!n"; // Patient ID: 3027574 // Mobile no.: 0502303285 @@ -212,7 +215,12 @@ class BaseAppClient { logApiEndpointError(endPoint, 'Error While Fetching data', statusCode); } else { // var decoded = utf8.decode(response.bodyBytes); - var parsed = json.decode(utf8.decode(response.bodyBytes)); + var parsed; + // if (url.contains('Services/NHIC.svc/REST/GetPatientInfo')) { + // parsed = json.decode(sampleNHICResponse); + // } else { + parsed = json.decode(utf8.decode(response.bodyBytes)); + // } // print("Response: $parsed"); diff --git a/lib/models/Authentication/get_patient_occupation_list_response.dart b/lib/models/Authentication/get_patient_occupation_list_response.dart new file mode 100644 index 00000000..60a21dc6 --- /dev/null +++ b/lib/models/Authentication/get_patient_occupation_list_response.dart @@ -0,0 +1,22 @@ +class GetPatientOccupationListResponse { + String? occupationID; + String? description; + String? descriptionN; + + GetPatientOccupationListResponse( + {this.occupationID, this.description, this.descriptionN}); + + GetPatientOccupationListResponse.fromJson(Map json) { + occupationID = json['OccupationID']; + description = json['Description']; + descriptionN = json['DescriptionN']; + } + + Map toJson() { + final Map data = new Map(); + data['OccupationID'] = this.occupationID; + data['Description'] = this.description; + data['DescriptionN'] = this.descriptionN; + return data; + } +} diff --git a/lib/models/Authentication/register_info_response.dart b/lib/models/Authentication/register_info_response.dart index 58a83232..8a19e97b 100644 --- a/lib/models/Authentication/register_info_response.dart +++ b/lib/models/Authentication/register_info_response.dart @@ -75,6 +75,7 @@ class RegisterInfoResponse { int? specialtyCode; dynamic specialtyNameAr; dynamic specialtyNameEn; + String? occupationID; RegisterInfoResponse( {this.date, @@ -152,7 +153,8 @@ class RegisterInfoResponse { this.registrationNumber, this.specialtyCode, this.specialtyNameAr, - this.specialtyNameEn}); + this.specialtyNameEn, + this.occupationID}); RegisterInfoResponse.fromJson(Map json) { date = json['Date']; @@ -231,6 +233,7 @@ class RegisterInfoResponse { specialtyCode = json['specialtyCode']; specialtyNameAr = json['specialtyNameAr']; specialtyNameEn = json['specialtyNameEn']; + occupationID = json['OccupationID']; } Map toJson() { @@ -311,6 +314,7 @@ class RegisterInfoResponse { data['specialtyCode'] = this.specialtyCode; data['specialtyNameAr'] = this.specialtyNameAr; data['specialtyNameEn'] = this.specialtyNameEn; + data['OccupationID'] = this.occupationID; return data; } } diff --git a/lib/models/Authentication/register_user_requet.dart b/lib/models/Authentication/register_user_requet.dart index bfc48da8..ba362995 100644 --- a/lib/models/Authentication/register_user_requet.dart +++ b/lib/models/Authentication/register_user_requet.dart @@ -16,6 +16,8 @@ class RegisterUserRequest { int? isHijri; String? healthId; String? zipCode; + String? occupationID; + RegisterUserRequest( {this.patientobject, this.patientIdentificationID, @@ -33,7 +35,8 @@ class RegisterUserRequest { this.dob, this.isHijri, this.healthId, - this.zipCode}); + this.zipCode, + this.occupationID}); RegisterUserRequest.fromJson(Map json) { patientobject = json['Patientobject'] != null ? new Patientobject.fromJson(json['Patientobject']) : null; @@ -53,6 +56,7 @@ class RegisterUserRequest { isHijri = json['IsHijri']; healthId = json['HealthId']; zipCode = json['ZipCode']; + occupationID = json['OccupationID']; } Map toJson() { @@ -76,6 +80,7 @@ class RegisterUserRequest { data['IsHijri'] = this.isHijri; data['HealthId'] = this.healthId; data['ZipCode'] = this.zipCode; + data['OccupationID'] = this.occupationID; return data; } } @@ -102,6 +107,7 @@ class Patientobject { String? sourceType; String? preferredLanguage; String? marital; + String? occupationID; Patientobject( {this.tempValue, @@ -124,7 +130,8 @@ class Patientobject { this.emailAddress, this.sourceType, this.preferredLanguage, - this.marital}); + this.marital, + this.occupationID}); Patientobject.fromJson(Map json) { tempValue = json['TempValue']; @@ -149,6 +156,7 @@ class Patientobject { preferredLanguage = json['PreferredLanguage']; marital = json['Marital']; + occupationID = json['OccupationID'] ?? ""; } Map toJson() { @@ -174,6 +182,7 @@ class Patientobject { data['SourceType'] = this.sourceType; data['PreferredLanguage'] = this.preferredLanguage; data['Marital'] = this.marital; + data['OccupationID'] = this.occupationID; return data; } } diff --git a/lib/pages/login/register-info.dart b/lib/pages/login/register-info.dart index e3d2f020..2c6cb4b0 100644 --- a/lib/pages/login/register-info.dart +++ b/lib/pages/login/register-info.dart @@ -1,6 +1,10 @@ +import 'dart:convert'; + +import 'package:auto_size_text/auto_size_text.dart'; import 'package:diplomaticquarterapp/analytics/google-analytics.dart'; import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/config/size_config.dart'; import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart'; import 'package:diplomaticquarterapp/core/viewModels/appointment_rate_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; @@ -9,7 +13,9 @@ import 'package:diplomaticquarterapp/models/Appointments/toDoCountProviderModel. import 'package:diplomaticquarterapp/models/Authentication/check_activation_code_response.dart' as checkActivation; import 'package:diplomaticquarterapp/models/Authentication/check_paitent_authentication_req.dart'; import 'package:diplomaticquarterapp/models/Authentication/countries_list.dart'; +import 'package:diplomaticquarterapp/models/Authentication/get_patient_occupation_list_response.dart'; import 'package:diplomaticquarterapp/models/Authentication/register_info_response.dart'; +import 'package:diplomaticquarterapp/pages/BookAppointment/dialog/clinic_list_dialog.dart'; import 'package:diplomaticquarterapp/pages/insurance/insurance_update_screen.dart'; import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; import 'package:diplomaticquarterapp/pages/rateAppointment/rate_appointment_doctor.dart'; @@ -84,11 +90,20 @@ class _RegisterInfo extends State { String gender = 'M'; String maritalStatus = 'M'; String nationality = 'SAU'; + String selectedOccupationID = ""; + + List patientOccupationList = []; + + // + GetPatientOccupationListResponse? selectedPatientOccupation; + + final GlobalKey projectDropdownKey = GlobalKey(); @override void initState() { if (widget.page == 1) { getCountries(); + // getPatientOccupationList(); } WidgetsBinding.instance.addPostFrameCallback((timeStamp) { getRegisterInfo(); @@ -121,7 +136,7 @@ class _RegisterInfo extends State { Expanded(child: SizedBox()) ], ), - SizedBox(height: 20), + SizedBox(height: 10), (isDubai && page == 1) ? Column( children: [ @@ -232,13 +247,13 @@ class _RegisterInfo extends State { : (registerInfo.healthId != null && page == 1) ? Column( children: [ - SizedBox(height: 20), + SizedBox(height: 10), getnameField(TranslationBase.of(context).identificationNumber, registerInfo.idNumber, TranslationBase.of(context).firstName, registerInfo.firstNameEn == '-' ? registerInfo.firstNameAr : registerInfo.firstNameEn), - SizedBox(height: 20), + SizedBox(height: 10), getnameField(TranslationBase.of(context).middleName, registerInfo.secondNameEn == '-' ? registerInfo.secondNameEn : registerInfo.secondNameEn, TranslationBase.of(context).lastName, registerInfo.lastNameEn == '-' ? registerInfo.lastNameEn : registerInfo.lastNameEn), - SizedBox(height: 20), + SizedBox(height: 10), getnameField( TranslationBase.of(context).gender, registerInfo.maritalStatusCode == 'U' @@ -248,17 +263,82 @@ class _RegisterInfo extends State { : 'Female', TranslationBase.of(context).maritalStatus, registerInfo.maritalStatus), - SizedBox(height: 20), + SizedBox(height: 10), getnameField(TranslationBase.of(context).nationality, registerInfo.nationality, TranslationBase.of(context).mobileNumber, registerd_data.patientMobileNumber.toString()), - SizedBox(height: 20), + SizedBox(height: 10), getnameField(TranslationBase.of(context).dateOfBirth, registerInfo.dateOfBirth, "", ""), - SizedBox(height: 20), ], ) : widget.page == 2 ? Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ + (!isDubai) + ? 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).selectOccupation, + style: TextStyle( + fontSize: 11, + letterSpacing: -0.44, + fontWeight: FontWeight.w600, + ), + ), + Container( + height: 18, + width: double.infinity, + child: DropdownButtonHideUnderline( + child: DropdownButton( + key: projectDropdownKey, + hint: Text(TranslationBase.of(context).selectOccupation), + value: selectedPatientOccupation, + iconSize: 0, + isExpanded: true, + style: TextStyle(fontSize: 14, letterSpacing: -0.56, color: Colors.black), + items: patientOccupationList.map((GetPatientOccupationListResponse item) { + return DropdownMenuItem( + value: item, + child: AutoSizeText( + projectViewModel.isArabic ? item.descriptionN! : item.description!, + maxLines: 1, + minFontSize: 10, + style: TextStyle( + fontSize: SizeConfig.textMultiplier! * 1.6, + fontWeight: FontWeight.w600, + letterSpacing: -0.39, + height: 0.8, + ), + ), + // Text('${item.name!}'), + ); + }).toList(), + onChanged: (GetPatientOccupationListResponse? newValue) { + setState(() { + selectedPatientOccupation = newValue!; + selectedOccupationID = selectedPatientOccupation!.occupationID!; + registerInfo.occupationID = selectedOccupationID; + }); + debugPrint("Selected Occupation ID: ${registerInfo.occupationID}"); + }, + ), + ), + ), + ], + ), + ), + Icon(Icons.keyboard_arrow_down), + ], + )) + : SizedBox(), + mHeight(20), Container( width: double.infinity, decoration: containerRadius(Colors.white, 12), @@ -407,6 +487,8 @@ class _RegisterInfo extends State { padding: EdgeInsets.all(10), child: DefaultButton(TranslationBase.of(context).cancel, () { Navigator.of(context).pop(); + // widget.changePageViewIndex!(0); + // getPatientOccupationList(); locator().loginRegistration.registration_cancel(step: page == 1 ? 'personal info' : 'other details'); }, textColor: Colors.white, color: Color(0xffD02127))), ), @@ -431,7 +513,15 @@ class _RegisterInfo extends State { widget.changePageViewIndex!(2); } } else { - registerNow(); + if (isDubai) { + registerNow(); + } else { + if (selectedPatientOccupation != null) { + registerNow(); + } else { + AppToast.showErrorToast(message: TranslationBase.of(context).selectOccupationError); + } + } } } @@ -445,12 +535,15 @@ class _RegisterInfo extends State { registerNow() { dynamic request; + if (isDubai) request = getTempUserRequestDubai(); else request = getTempUserRequest(); - GifLoaderDialogUtils.showMyDialog(context, barrierDismissible: false); + print(request); + + GifLoaderDialogUtils.showMyDialog(context, barrierDismissible: true); dynamic res; this .authService @@ -503,7 +596,7 @@ class _RegisterInfo extends State { okFunction: () => {ConfirmDialog.closeAlertDialog(context)}, cancelFunction: () => {ConfirmDialog.closeAlertDialog(context)}); dialog.showAlertDialog(context); - projectViewModel.analytics.loginRegistration.registration_fail(errorType: err); + projectViewModel.analytics.loginRegistration.registration_fail(errorType: ""); }); } @@ -530,6 +623,16 @@ class _RegisterInfo extends State { if (isDubai) location = '2'; }); } + + try { + var patientOccupationListVal = json.decode(await sharedPref.getString(PATIENT_OCCUPATION_LIST)); + patientOccupationListVal.forEach((v) { + patientOccupationList.add(new GetPatientOccupationListResponse.fromJson(v)); + }); + setState(() {}); + } catch (ex) { + print(ex.toString()); + } } getTempUserRequest() { @@ -559,6 +662,7 @@ class _RegisterInfo extends State { "EmailAddress": email, "SourceType": location, "PreferredLanguage": registerd_data.languageID.toString(), + "OccupationID": registerInfo.occupationID, "Marital": registerInfo.maritalStatusCode == 'U' ? '0' : registerInfo.maritalStatusCode == 'M' @@ -718,7 +822,7 @@ class _RegisterInfo extends State { Navigator.pushAndRemoveUntil( context, MaterialPageRoute(builder: (context) => LandingPage()), - (Route route) => false, + (Route route) => false, ); Navigator.push(context, FadePage(page: InsuranceUpdate())); }, @@ -726,7 +830,7 @@ class _RegisterInfo extends State { Navigator.pushAndRemoveUntil( context, MaterialPageRoute(builder: (context) => LandingPage()), - (Route route) => false, + (Route route) => false, ); }); dialog.showAlertDialog(context); @@ -911,6 +1015,25 @@ class _RegisterInfo extends State { ), ); } + + void openDropdown(GlobalKey key) { + GestureDetector? detector; + void searchForGestureDetector(BuildContext element) { + element.visitChildElements((element) { + if (element.widget != null && element.widget is GestureDetector) { + detector = element.widget as GestureDetector?; + // return false; + } else { + searchForGestureDetector(element); + } + // return true; + }); + } + + searchForGestureDetector(key.currentContext!); + assert(detector != null); + detector!.onTap!(); + } } class Language { diff --git a/lib/pages/login/register.dart b/lib/pages/login/register.dart index 2dd32163..fdb04362 100644 --- a/lib/pages/login/register.dart +++ b/lib/pages/login/register.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + import 'package:diplomaticquarterapp/analytics/flows/login_registration.dart'; import 'package:diplomaticquarterapp/analytics/google-analytics.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; @@ -7,6 +9,7 @@ import 'package:diplomaticquarterapp/locator.dart'; import 'package:diplomaticquarterapp/models/Authentication/check_user_status_reponse.dart'; import 'package:diplomaticquarterapp/models/Authentication/check_user_status_req.dart'; import 'package:diplomaticquarterapp/models/Authentication/checkpatient_for_registration.dart'; +import 'package:diplomaticquarterapp/models/Authentication/get_patient_occupation_list_response.dart'; import 'package:diplomaticquarterapp/pages/login/confirm-login.dart'; import 'package:diplomaticquarterapp/pages/login/login-type.dart'; import 'package:diplomaticquarterapp/pages/login/login.dart'; @@ -54,6 +57,16 @@ class _Register extends State { late bool isLoading; + List patientOccupationList = []; + + GetPatientOccupationListResponse? selectedPatientOccupation; + + @override + void initState() { + getPatientOccupationList(); + super.initState(); + } + @override Widget build(BuildContext context) { return AppScaffold( @@ -357,14 +370,14 @@ class _Register extends State { nRequest['forRegister'] = true; nRequest['isRegister'] = true; nRequest["PatientIdentificationID"] = nRequest["PatientIdentificationID"].toString(); - nRequest['dob'] = isHijri == 1 ? dob.text : dateFormat.format(selectedDate); + nRequest['dob'] = isHijri == 1 ? dob.text : dateFormat.format(selectedDate); nRequest['isHijri'] = isHijri; sharedPref.setObject(REGISTER_DATA_FOR_LOGIIN, nRequest); sharedPref.setString(LOGIN_TOKEN_ID, response['LogInTokenID']); - if(request.patientOutSA ==0 ) { + if (request.patientOutSA == 0) { this.chekUserData(response['LogInTokenID']); - }else{ - Navigator.of(context).push(FadePage(page: ConfirmLogin(changePageViewIndex: widget.changePageViewIndex, fromRegistration: true, isDubai:true))); + } else { + Navigator.of(context).push(FadePage(page: ConfirmLogin(changePageViewIndex: widget.changePageViewIndex, fromRegistration: true, isDubai: true))); } } } else { @@ -405,6 +418,7 @@ class _Register extends State { { result = CheckUserStatusResponse.fromJson(result as Map), sharedPref.setObject(NHIC_DATA, result), + // widget.changePageViewIndex!(1), Navigator.of(context).push(FadePage(page: ConfirmLogin(changePageViewIndex: widget.changePageViewIndex, fromRegistration: true))), } else @@ -413,4 +427,13 @@ class _Register extends State { } }); } + + getPatientOccupationList() async { + patientOccupationList.clear(); + await authService.getPatientOccupationList().then((result) { + sharedPref.setString(PATIENT_OCCUPATION_LIST, json.encode(result['GetOccupationLst'])); + }).catchError((err) { + AppToast.showErrorToast(message: err); + }); + } } diff --git a/lib/services/authentication/auth_provider.dart b/lib/services/authentication/auth_provider.dart index 81a3dfad..d9b9935e 100644 --- a/lib/services/authentication/auth_provider.dart +++ b/lib/services/authentication/auth_provider.dart @@ -1910,6 +1910,24 @@ class AuthProvider with ChangeNotifier { } } + Future getPatientOccupationList() async { + Map request = {"ProjectOutSA": false}; + + dynamic localRes; + try { + await new BaseAppClient().post(GET_PATIENT_OCCUPATION_LIST, onSuccess: (dynamic response, int statusCode) { + localRes = response; + }, onFailure: (String error, int statusCode) { + localRes = error; + return Future.value(error); + }, body: request); + // logout(); + return Future.value(localRes); + } catch (error) { + throw error; + } + } + logout() async { await sharedPref.remove(LOGIN_TOKEN_ID); await sharedPref.remove(PHARMACY_CUSTOMER_ID); diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index c7d32011..4f2fbce0 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -3023,6 +3023,8 @@ class TranslationBase { String get incorrectNationalId => localizedValues["incorrectNationalId"][locale.languageCode]; String get resultStatus => localizedValues["resultStatus"][locale.languageCode]; String get labResultFlag => localizedValues["labResultFlag"][locale.languageCode]; + String get selectOccupation => localizedValues["selectOccupation"][locale.languageCode]; + String get selectOccupationError => localizedValues["selectOccupationError"][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { From 291cf16d22702b89a23bd5b8d748f6bcdc596a7b Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Thu, 19 Dec 2024 15:38:11 +0300 Subject: [PATCH 24/31] Changes for Laser clinic full body part --- .../body_parts/female/full_body_female.png | Bin 0 -> 19215 bytes .../new/body_parts/male/full_body_male.png | Bin 0 -> 32752 bytes .../components/LaserClinic.dart | 89 ++++++++++-------- lib/uitl/laser_body_parts_data.dart | 4 + 4 files changed, 53 insertions(+), 40 deletions(-) create mode 100644 assets/images/new/body_parts/female/full_body_female.png create mode 100644 assets/images/new/body_parts/male/full_body_male.png diff --git a/assets/images/new/body_parts/female/full_body_female.png b/assets/images/new/body_parts/female/full_body_female.png new file mode 100644 index 0000000000000000000000000000000000000000..fb6a3756c1e1cf3228fdf6cc856a64451e3fa5b8 GIT binary patch literal 19215 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 Mmm`gpI@ZwwQdHV0DX(F!+-p8WMUOz8(J&Ga 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 with SingleTickerProviderStat res['Laser_GetBodyPartsByCategoryList'].forEach((v) { _tempList.add(LaserBodyPart.fromJson(v)); }); - if (_tempList[0].category == 1 || _tempList[0].category == 11 || _tempList[0].category == 2 || _tempList[0].category == 10) { - fullBody = _tempList[0]; + // if (_tempList[0].category == 1 || _tempList[0].category == 11 || _tempList[0].category == 2 || _tempList[0].category == 10) { + if (_tempList[0].category == 2 || _tempList[0].category == 10) { + // fullBody = _tempList[0]; _tempList.removeAt(0); } laserBodyPartsList = _tempList; @@ -260,8 +261,15 @@ class _LaserClinicState extends State with SingleTickerProviderStat } Future navigateToSearchResults(context, List docList, List patientDoctorAppointmentListHospital) async { - Navigator.push(context, FadePage(page: SearchResults(isLiveCareAppointment: false, doctorsList: docList, patientDoctorAppointmentListHospital: patientDoctorAppointmentListHospital, isDoctorSearchResult: true,))) - .then((value) { + Navigator.push( + context, + FadePage( + page: SearchResults( + isLiveCareAppointment: false, + doctorsList: docList, + patientDoctorAppointmentListHospital: patientDoctorAppointmentListHospital, + isDoctorSearchResult: true, + ))).then((value) { setState(() { // dropdownValue = null; }); @@ -356,46 +364,47 @@ class _LaserClinicState extends State with SingleTickerProviderStat child: Column( mainAxisSize: MainAxisSize.min, children: [ - if (fullBody != null) - Row( - children: [ - SizedBox( - width: 22, - height: 22, - child: Theme( - data: Theme.of(context).copyWith( - unselectedWidgetColor: Color(0xffEAEAEA), - ), - child: Checkbox( - value: _isFullBody, - onChanged: (value) { - setState(() { - if (value!) { - _selectedBodyPartList.clear(); - _selectedBodyPartList.add(fullBody); - } else { - _selectedBodyPartList.clear(); - } - _isFullBody = !_isFullBody; - }); - }, - activeColor: Color(0xffD02127), - ), - ), - ), - SizedBox(width: 12), - Text( - projectViewModel.isArabic ? fullBody.bodyPartN! : fullBody.bodyPart!, - style: TextStyle(fontSize: 15, fontWeight: FontWeight.w600, color: Color(0xff2B353E), letterSpacing: -0.6, height: 21 / 14), - ), - ], - ), + // if (fullBody != null) + // Row( + // children: [ + // SizedBox( + // width: 22, + // height: 22, + // child: Theme( + // data: Theme.of(context).copyWith( + // unselectedWidgetColor: Color(0xffEAEAEA), + // ), + // child: Checkbox( + // value: _isFullBody, + // onChanged: (value) { + // setState(() { + // if (value!) { + // _selectedBodyPartList.clear(); + // _selectedBodyPartList.add(fullBody); + // } else { + // _selectedBodyPartList.clear(); + // } + // _isFullBody = !_isFullBody; + // }); + // }, + // activeColor: Color(0xffD02127), + // ), + // ), + // ), + // SizedBox(width: 12), + // Text( + // projectViewModel.isArabic ? fullBody.bodyPartN! : fullBody.bodyPart!, + // style: TextStyle(fontSize: 15, fontWeight: FontWeight.w600, color: Color(0xff2B353E), letterSpacing: -0.6, height: 21 / 14), + // ), + // ], + // ), GridView.builder( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, childAspectRatio: 85 / 107, crossAxisSpacing: 4, mainAxisSpacing: 21), physics: NeverScrollableScrollPhysics(), shrinkWrap: true, itemCount: laserBodyPartsList.length, - padding: fullBody != null ? EdgeInsets.only(top: 16) : EdgeInsets.zero, + // padding: fullBody != null ? EdgeInsets.only(top: 16) : EdgeInsets.zero, + padding: EdgeInsets.zero, itemBuilder: (BuildContext context, int index) { bool _isSelected = _selectedBodyPartList.any((file) => file.id == laserBodyPartsList[index].id); return InkWell( @@ -410,7 +419,7 @@ class _LaserClinicState extends State with SingleTickerProviderStat setState(() {}); return; } - AppToast.showToast(message: TranslationBase.of(context).laserMaxLimitReach); + AppToast.showToast(message: TranslationBase.of(context).laserMaxLimitReach, timeInSeconds: 3); return; } if (_isSelected) { diff --git a/lib/uitl/laser_body_parts_data.dart b/lib/uitl/laser_body_parts_data.dart index d7e5742d..366201a0 100644 --- a/lib/uitl/laser_body_parts_data.dart +++ b/lib/uitl/laser_body_parts_data.dart @@ -18,6 +18,7 @@ class LaserBodyParts { } Map maleBodyMap = { + "1": imagePng("assets/images/new/body_parts/male/full_body_male.png"), "40": imagePng("assets/images/new/body_parts/male/upper_arm.png"), "41": imagePng("assets/images/new/body_parts/male/lower_arm.png"), "42": imagePng("assets/images/new/body_parts/male/chest.png"), @@ -43,6 +44,7 @@ class LaserBodyParts { }; Map maleBodyRetouchMap = { + "50": imagePng("assets/images/new/body_parts/male/full_body_male.png"), "51": imagePng("assets/images/new/body_parts/male/upper_arm.png"), "52": imagePng("assets/images/new/body_parts/male/lower_arm.png"), "53": imagePng("assets/images/new/body_parts/male/chest.png"), @@ -57,6 +59,7 @@ class LaserBodyParts { }; Map femaleBodyMap = { + "1": imagePng("assets/images/new/body_parts/female/full_body_female.png"), "40": imagePng("assets/images/new/body_parts/female/upper_arm.png"), "41": imagePng("assets/images/new/body_parts/female/lower_arm.png"), "42": imagePng("assets/images/new/body_parts/female/chest.png"), @@ -89,6 +92,7 @@ class LaserBodyParts { }; Map femaleBodyRetouchMap = { + "50": imagePng("assets/images/new/body_parts/female/full_body_female.png"), "51": imagePng("assets/images/new/body_parts/female/upper_arm.png"), "52": imagePng("assets/images/new/body_parts/female/lower_arm.png"), "53": imagePng("assets/images/new/body_parts/female/chest.png"), From 9909cfaa5719322b687b917c120024926554bf5c Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Sun, 22 Dec 2024 11:46:27 +0300 Subject: [PATCH 25/31] QRCode & Location checkin implemented in ER Online Check-In --- lib/config/localized_values.dart | 2 +- .../EROnlineCheckIn/EROnlineCheckInHome.dart | 131 +++++- .../EROnlineCheckInNFCQRCLocation.dart | 374 ++++++++++++++++++ .../EROnlineCheckInPaymentDetails.dart | 7 +- lib/widgets/bottom_options/bottom_sheet.dart | 89 +++++ 5 files changed, 583 insertions(+), 20 deletions(-) create mode 100644 lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInNFCQRCLocation.dart create mode 100644 lib/widgets/bottom_options/bottom_sheet.dart diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 348eade4..a2c9d445 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -2024,7 +2024,7 @@ const Map localizedValues = { "hospitalNavigationSubtitle": {"en": "Navigation", "ar": "المستشفى"}, "continueAgreeTerms": {"en": "By continuing, You agree to the above Terms and Conditions.", "ar": "من خلال المتابعة، فإنك توافق على الشروط والأحكام المذكورة أعلاه."}, "agreeText": {"en": "Agree", "ar": "أوافق"}, - "ERCheckInSuccess": {"en": "Your ER Online Check-In has been successfully done.", "ar": "لقد تم تسجيل وصولك للطوارئ عبر الإنترنت بنجاح."}, + "ERCheckInSuccess": {"en": "Your ER Online Check-In has been successfully done. Please proceed to the waiting area.", "ar": "لقد تم تسجيل دخولك عبر الإنترنت بنجاح. يرجى التوجه إلى منطقة الانتظار."}, "generalConsent": {"en": "General Consent: ", "ar": "موافقة عامة:"}, "generalConsent1": { diff --git a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart index bca3a0b0..f56e8a29 100644 --- a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart +++ b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart @@ -1,6 +1,8 @@ +import 'package:barcode_scan2/barcode_scan2.dart'; import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/ErService/EROnlineCheckIn/EROnlineCheckInBookAppointment.dart'; +import 'package:diplomaticquarterapp/pages/ErService/EROnlineCheckIn/EROnlineCheckInNFCQRCLocation.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'; @@ -11,6 +13,7 @@ import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/location_util.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/utils_new.dart'; +import 'package:diplomaticquarterapp/widgets/bottom_options/bottom_sheet.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'; @@ -288,22 +291,76 @@ class _EROnlineCheckInHomePageState extends State with 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); - } + showMyBottomSheet(context, + callBackFunc: () {}, + child: Padding( + padding: const EdgeInsets.all(21.0), + child: Column( + children: [ + Text(TranslationBase.of(context).scanQRHospital, + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w600, + letterSpacing: -0.48, + )), + mHeight(21), + GridView( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: (MediaQuery.of(context).size.width < 550) ? 3 : 5, childAspectRatio: 1 / 1, crossAxisSpacing: 8, mainAxisSpacing: 12), + children: [ + attendanceMethod(TranslationBase.of(context).scanNFC, "assets/images/nfc/contactless.svg", true, () { + 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); + } + }), + attendanceMethod(TranslationBase.of(context).pharmaLiveCareScanQR, "assets/images/new/services/qr_code.svg", true, () async { + String onlineCheckInQRCode = (await BarcodeScanner.scan().then((value) => value.rawContent)); + if (onlineCheckInQRCode != "") { + print(onlineCheckInQRCode); + getProjectIDFromNFC(onlineCheckInQRCode, true); + // sendNfcCheckInRequest(onlineCheckInQRCode, 2); + } else {} + }), + attendanceMethod(TranslationBase.of(context).checkInViaLocation, "assets/images/new/services/location.svg", true, () {}) + ], + ), + ], + ), + )); + + // Navigator.push(context, FadePage(page: EROnlineCheckInNFCQRLocation(projectID: 15))).then((value) {}); + + // 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, ), @@ -315,6 +372,8 @@ class _EROnlineCheckInHomePageState extends State with child: DefaultButton( TranslationBase.of(context).checkinOptions, () { + // Navigator.push(context, FadePage(page: EROnlineCheckInNFCQRLocation(projectID: 15))).then((value) {}); + if (_supportsNFC) { Future.delayed(const Duration(milliseconds: 500), () { showNfcReader(context, onNcfScan: (String nfcId) { @@ -439,6 +498,46 @@ class _EROnlineCheckInHomePageState extends State with }); } + Widget markCheckInWidget() { + return GridView( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + padding: const EdgeInsets.only(bottom: 0, top: 21), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: (MediaQuery.of(context).size.width < 550) ? 3 : 5, childAspectRatio: 1 / 1, crossAxisSpacing: 8, mainAxisSpacing: 8), + children: [], + ); + } + + Widget attendanceMethod(String title, String image, bool isEnabled, VoidCallback onPress) => InkWell( + onTap: () { + Navigator.pop(context); + onPress(); + }, + child: Container( + decoration: containerColorRadiusBorderWidth(Colors.white, 15, CustomColors.darkGreyColor, 1), + clipBehavior: Clip.antiAlias, + padding: const EdgeInsets.only(left: 10, right: 10, top: 14, bottom: 14), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded(child: SvgPicture.asset(image, color: Colors.black, alignment: Alignment.topLeft)), + Text( + title, + style: TextStyle(color: Colors.black, fontSize: 14, letterSpacing: -0.68, fontWeight: FontWeight.bold), + ), + // title.toText17(isBold: true, color: Colors.white), + ], + ), + ), + ); + + // .onPress( + // () { + // if (!isEnabled) return; + // onPress(); + // }, + // ); + void checkPatientERAdvanceBalance() { locationUtils.getCurrentLocation(); GifLoaderDialogUtils.showMyDialog(context); diff --git a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInNFCQRCLocation.dart b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInNFCQRCLocation.dart new file mode 100644 index 00000000..d3f1e20f --- /dev/null +++ b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInNFCQRCLocation.dart @@ -0,0 +1,374 @@ +import 'dart:typed_data'; + +import 'package:barcode_scan2/barcode_scan2.dart'; +import 'package:diplomaticquarterapp/analytics/google-analytics.dart'; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/model/privilege/ProjectDetailListModel.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/locator.dart'; +import 'package:diplomaticquarterapp/models/Appointments/AppoimentAllHistoryResultList.dart'; +import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart'; +import 'package:diplomaticquarterapp/models/Appointments/PatientShareResposne.dart'; +import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; +import 'package:diplomaticquarterapp/models/header_model.dart'; +import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; +import 'package:diplomaticquarterapp/routes.dart'; +import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.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/location_util.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/custom_text_button.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/medical/medical_profile_item.dart'; +import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; +import 'package:diplomaticquarterapp/widgets/new_design/doctor_header.dart'; +import 'package:diplomaticquarterapp/widgets/nfc/nfc_reader_sheet.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.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 EROnlineCheckInNFCQRLocation extends StatefulWidget { + // late PatientShareResponse? patientShareResponse; + // late AppoitmentAllHistoryResultList? appointment; + // late String? appoQR; + // AuthenticatedUser? authUser; + // AppSharedPreferences sharedPref = AppSharedPreferences(); + + int projectID; + + EROnlineCheckInNFCQRLocation({required this.projectID}); + + @override + _EROnlineCheckInNFCQRLocationState createState() => _EROnlineCheckInNFCQRLocationState(); +} + +class _EROnlineCheckInNFCQRLocationState extends State { + late Uint8List _bytes; + bool _supportsNFC = false; + late BuildContext _context; + + late ProjectViewModel projectViewModel; + late LocationUtils locationUtils; + ProjectDetailListModel projectDetailListModel = ProjectDetailListModel(); + + @override + void initState() { + super.initState(); + } + + startNFCScan() { + Future.delayed(const Duration(milliseconds: 500), () { + showNfcReader(context, onNcfScan: (String nfcId) { + Future.delayed(const Duration(milliseconds: 100), () { + sendNfcCheckInRequest(nfcId, 2); + }); + }, onCancel: () { + // Navigator.of(context).pop(); + }); + }); + } + + startQRCodeScan() async { + String onlineCheckInQRCode = (await BarcodeScanner.scan().then((value) => value.rawContent)); + if (onlineCheckInQRCode != "") { + sendNfcCheckInRequest(onlineCheckInQRCode, 2); + } else {} + } + + startLocationCheckIn() async { + GifLoaderDialogUtils.showMyDialog(context); + locationUtils = new LocationUtils(isShowConfirmDialog: true, context: context); + locationUtils.getCurrentLocation(callBack: (value) { + projectDetailListModel = Utils.getProjectDetailObj(projectViewModel, widget.projectID); + double dist = Utils.distance(value.latitude, value.longitude, double.parse(projectDetailListModel.latitude!), double.parse(projectDetailListModel.longitude!)).ceilToDouble() * 1000; + print(dist); + if (dist <= projectDetailListModel.geofenceRadius!) { + sendNfcCheckInRequest(projectDetailListModel.checkInQrCode!, 2); + } else { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: TranslationBase.of(context).locationCheckInError); + } + }); + } + + @override + Widget build(BuildContext context) { + projectViewModel = Provider.of(context); + _context = context; + FlutterNfcKit.nfcAvailability.then((value) { + _supportsNFC = (value == NFCAvailability.available); + }); + List checkInOptionsList = getCheckInOptionsList(context); + return AppScaffold( + appBarTitle: TranslationBase.of(context).onlineCheckIn, + isShowAppBar: true, + showNewAppBar: true, + showNewAppBarTitle: true, + body: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // DoctorHeader( + // headerModel: HeaderModel( + // widget.appointment!.doctorTitle! + " " + widget.appointment!.doctorNameObj!, + // widget.appointment!.doctorID ?? 0, + // widget.appointment!.doctorImageURL!, + // widget.appointment!.doctorSpeciality!, + // "", + // widget.appointment!.projectName!, + // DateUtil.convertStringToDate(widget.appointment!.appointmentDate!), + // widget.appointment!.isLiveCareAppointment! + // ? DateUtil.convertStringToDate(widget.appointment!.appointmentDate!).toString().split(" ")[1].substring(0, 5) + // : widget.appointment!.startTime!.substring(0, 5), + // "null", + // widget.appointment!.doctorRate, + // widget.appointment!.actualDoctorRate, + // widget.appointment!.noOfPatientsRate, + // "", + // ), + // isShowName: true, + // isNeedToShowButton: false, + // buttonTitle: '', + // onTap: () {}, + // onRatingAndReviewTap: () {}, + // ), + InkWell( + child: Container( + margin: EdgeInsets.only(top: 30.0), + padding: EdgeInsets.all(8), + child: SvgPicture.asset( + "assets/images/nfc/contactless.svg", + width: 80.0, + height: 80.0, + ), + ), + onTap: () { + showNfcReader(context, onNcfScan: (String nfcId) { + Future.delayed(const Duration(milliseconds: 100), () { + sendNfcCheckInRequest(nfcId, 2); + }); + }, onCancel: () { + // Navigator.of(context).pop(); + }); + }, + ), + Row( + children: [ + Expanded( + child: Container( + width: double.infinity, + margin: EdgeInsets.only(top: 15.0, bottom: 10.0, left: 20.0, right: 20.0), + child: Text(TranslationBase.of(context).scanQRHospital, + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w600, + letterSpacing: -0.48, + )), + ), + ), + ], + ), + mHeight(21), + Padding( + padding: EdgeInsets.only(left: 21, right: 21), + child: GridView.builder( + shrinkWrap: true, + primary: false, + physics: NeverScrollableScrollPhysics(), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, childAspectRatio: 2 / 2, crossAxisSpacing: 12, mainAxisSpacing: 12), + padding: EdgeInsets.zero, + itemCount: checkInOptionsList.length, + itemBuilder: (BuildContext context, int index) { + return checkInOptionsList[index]; + }, + ), + ), + ], + ), + ), + // bottomSheet: Container( + // color: CustomColors.appBackgroudGreyColor, + // padding: EdgeInsets.all(21), + // // height: 45.0, + // child: Row( + // children: [ + // Expanded( + // flex: 1, + // child: ButtonTheme( + // shape: RoundedRectangleBorder( + // borderRadius: BorderRadius.circular(10.0), + // ), + // height: 45.0, + // child: CustomTextButton( + // backgroundColor: CustomColors.green, + // elevation: 0, + // onPressed: () { + // startNFCScan(); + // }, + // child: Text(TranslationBase.of(context).scanNFC, + // style: TextStyle( + // fontSize: 18.0, + // color: Colors.white, + // )), + // ), + // ), + // ), + // ], + // ), + // ), + ); + } + + List getCheckInOptionsList(BuildContext context) { + List optionsList = []; + + optionsList.add( + InkWell( + onTap: () { + if (projectViewModel.havePrivilege(102)) { + startLocationCheckIn(); + } + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).checkInViaLocation, + imagePath: 'location.svg', + subTitle: "", + isEnable: projectViewModel.havePrivilege(102), + width: 70.0, + height: 70.0, + ), + ), + ); + + optionsList.add( + InkWell( + onTap: () { + if (projectViewModel.havePrivilege(79)) { + startQRCodeScan(); + } + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).pharmaLiveCareScanQR, + imagePath: 'qr_code.svg', + subTitle: "", + isEnable: projectViewModel.havePrivilege(79), + width: 80.0, + height: 80.0, + ), + ), + ); + + optionsList.add( + InkWell( + onTap: () { + if (projectViewModel.havePrivilege(80) && _supportsNFC) { + startNFCScan(); + } else { + Utils.showErrorToast(TranslationBase.of(context).NFCNotSupported); + } + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).scanNFC, + imagePath: 'contactless.svg', + subTitle: "", + isEnable: projectViewModel.havePrivilege(80), + width: 80.0, + height: 80.0, + ), + ), + ); + + return optionsList; + } + + Future navigateToHome(context) async { + Navigator.of(context).pushNamed(HOME); + } + + getPatientShare(context, String appointmentNo, int clinicID, int projectID, DoctorList docObject) {} + + String getDate(String appoDate) { + var appoDateFormatted = ""; + + var dateObj = DateUtil.convertStringToDate(appoDate); + + setState(() { + appoDateFormatted = DateUtil.getWeekDay(dateObj.weekday) + + ", " + + dateObj.day.toString() + + " " + + DateUtil.getMonth(dateObj.month) + + " " + + dateObj.year.toString() + + ", " + + dateObj.hour.toString() + + ":" + + dateObj.minute.toString() + + ":00"; + }); + + return appoDateFormatted; + } + + String getDoctorSpeciality(List docSpecial) { + String docSpeciality = ""; + if (docSpecial != null && docSpecial.length != 0) { + docSpecial.forEach((v) { + docSpeciality = docSpeciality + v + "\n"; + }); + } + return docSpeciality; + } + + sendNfcCheckInRequest(String nfcId, int checkInBy) { + GifLoaderDialogUtils.showMyDialog(context); + + DoctorsListService service = new DoctorsListService(); + + // service.sendCheckinNfcRequest(widget!.patientShareResponse!.appointmentNo!, nfcId, widget.patientShareResponse!.projectID!, checkInBy, widget.patientShareResponse!.clinicID!, context).then((res) { + // print(res); + // + // GifLoaderDialogUtils.hideDialog(context); + // _showMyDialog(res["SuccessMsg"], this.context); + // }).catchError((err) { + // GifLoaderDialogUtils.hideDialog(context); + // print(err); + // _showMyDialog(err, this.context); + // }); + } + + Future _showMyDialog(String message, BuildContext context) async { + return showDialog( + context: context, + barrierDismissible: true, // user must tap button! + builder: (BuildContext context) { + return AlertDialog( + title: const Text('Alert'), + content: SingleChildScrollView( + child: ListBody( + children: [ + Text(message), + ], + ), + ), + actions: [ + TextButton( + child: const Text('OK'), + onPressed: () { + Navigator.of(context).pop(); + Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (context) => LandingPage()), (Route r) => false); + }, + ), + ], + ); + }, + ); + } +} diff --git a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInPaymentDetails.dart b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInPaymentDetails.dart index 13e5c733..a9873df4 100644 --- a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInPaymentDetails.dart +++ b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInPaymentDetails.dart @@ -521,9 +521,10 @@ class _EROnlineCheckInPaymentDetailsState extends State LandingPage()), (Route r) => false); } else { autoGenerateInvoiceER(paymentRes); } diff --git a/lib/widgets/bottom_options/bottom_sheet.dart b/lib/widgets/bottom_options/bottom_sheet.dart new file mode 100644 index 00000000..c59c565e --- /dev/null +++ b/lib/widgets/bottom_options/bottom_sheet.dart @@ -0,0 +1,89 @@ +import 'package:diplomaticquarterapp/uitl/utils_new.dart'; +import 'package:flutter/material.dart'; + +void showMyBottomSheet(BuildContext context, {required Widget child, required VoidCallback callBackFunc, String? type}) { + showModalBottomSheet( + context: context, + isScrollControlled: true, + backgroundColor: Colors.transparent, + builder: (BuildContext context) { + return Container( + constraints: BoxConstraints( + maxHeight: type =='CONTINUE_ACTION' ? MediaQuery.of(context).size.height *.75 : double.infinity,), + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topRight: Radius.circular(25), + topLeft: Radius.circular(25), + ), + ), + padding: MediaQuery.of(context).viewInsets, + clipBehavior: Clip.antiAlias, + child:SingleChildScrollView(child: Column( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + mHeight(13), + Container( + height: 6, + width: 60, + decoration: const BoxDecoration( + color: Color(0xff9A9A9A), + borderRadius: BorderRadius.all( + Radius.circular(20), + ), + ), + ), + mHeight(8), + child, + ], + )), + ); + }, + ).then((value) { + // print("BACK FROM DELEGATE!!!!"); + // print("value: $value"); + if (value == "delegate_reload") { + callBackFunc(); + } + }); +} + +class BottomSheetItem extends StatelessWidget { + final Function onTap; + final IconData icon; + final String title; + final Color color; + + const BottomSheetItem({Key? key, required this.onTap, required this.title, required this.icon, this.color = Colors.black}) : super(key: key); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () { + if (onTap != null) { + Navigator.pop(context); + onTap(); + } + }, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 18.0, vertical: 18.0), + child: Row( + children: [ + if (icon != null) + Icon( + icon, + color: color, + size: 18.0, + ), + if (icon != null) SizedBox(width: 24.0), + Text( + title ?? "", + style: TextStyle(color: color), + ), + ], + ), + ), + ); + } +} From d474eb9a24e0c33342515e3b1f4287ab885af893 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Sun, 22 Dec 2024 13:47:05 +0300 Subject: [PATCH 26/31] Code commented for Lab result widget, ER Online CheckIn QR & location check-in & Patient occupation selection to publish laser clinic changes to store - VersionID 17.0 --- lib/config/config.dart | 6 +- lib/config/localized_values.dart | 10 + .../register_info_response.dart | 9 +- .../Authentication/register_user_requet.dart | 18 +- .../EROnlineCheckIn/EROnlineCheckInHome.dart | 178 +++++++++--------- lib/pages/login/register-info.dart | 176 ++++++++--------- lib/uitl/translations_delegate_base.dart | 11 ++ .../medical/LabResult/LabResultWidget.dart | 22 ++- lib/widgets/in_app_browser/InAppBrowser.dart | 4 +- 9 files changed, 235 insertions(+), 199 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index 9f093c9d..be94c94c 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -21,8 +21,8 @@ var PACKAGES_ORDERS = '/api/orders'; var PACKAGES_ORDER_HISTORY = '/api/orders/items'; var PACKAGES_TAMARA_OPT = '/api/orders/paymentoptions/tamara'; // var BASE_URL = 'http://10.50.100.198:2018/'; - var BASE_URL = 'https://uat.hmgwebservices.com/'; -// var BASE_URL = 'https://hmgwebservices.com/'; + // var BASE_URL = 'https://uat.hmgwebservices.com/'; +var BASE_URL = 'https://hmgwebservices.com/'; // var BASE_URL = 'https://orash.cloudsolutions.com.sa/'; // var BASE_URL = 'https://vidauat.cloudsolutions.com.sa/'; // var BASE_URL = 'https://vidamergeuat.cloudsolutions.com.sa/'; @@ -352,7 +352,7 @@ var CAN_PAY_FOR_FOR_WALKIN_APPOINTMENT = 'Services/Doctors.svc/REST/CanPayForWal var CHANNEL = 3; var GENERAL_ID = 'Cs2020@2016\$2958'; var IP_ADDRESS = '10.20.10.20'; -var VERSION_ID = 16.9; +var VERSION_ID = 17.0; var SETUP_ID = '91877'; var LANGUAGE = 2; // var PATIENT_OUT_SA = 0; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index a2c9d445..e15d97af 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -2121,4 +2121,14 @@ const Map localizedValues = { "labResultFlag": {"en": "Flag", "ar": "Flag"}, "selectOccupation": {"en": "Select Occupation", "ar": "اختر المهنة"}, "selectOccupationError": {"en": "Please select your occupation.", "ar": "الرجاء تحديد مهنتك."}, + + "whatIsOnlineCheckIn": {"en": "What is Online Check-In?", "ar": "ما هو تسجيل الوصول عبر الإنترنت؟"}, + "EROnlineCheckInDesc1": {"en": "Online check-in lets patients fill out forms, share insurance details, and book appointments online, making their visit smoother and quicker.", "ar": "يتيح تسجيل الوصول عبر الإنترنت للمرضى ملء النماذج ومشاركة تفاصيل التأمين وحجز المواعيد عبر الإنترنت، مما يجعل زيارتهم أكثر سلاسة وسرعة."}, + "EROnlineCheckInHow": {"en": "How can i use Online Check-In?", "ar": "كيف يمكنني استخدام تسجيل الوصول عبر الإنترنت؟"}, + "EROnlineCheckInTapOn": {"en": "Tap On", "ar": "اضغط على"}, + "EROnlineCheckInHoldPhone": {"en": "Hold your phone", "ar": "أمسك هاتفك"}, + "EROnlineCheckInWaitTurn": {"en": "Wait your turn", "ar": "انتظر دورك"}, + "EROnlineCheckInWaitTurnInstruction": {"en": "Please wait in the waiting area until called by the nurse.", "ar": "يرجى الانتظار في منطقة الانتظار حتى يتم استدعاؤك من قبل الممرضة."}, + "EROnlineCheckInHoldPhoneInstruction": {"en": "Hold the phone 1 to 2 cm from the NFC sign displayed on the board", "ar": "امسك الهاتف على مسافة 1 إلى 2 سم من علامة NFC المعروضة على اللوحة"}, + "EROnlineCheckInTapOnCheckIn": {"en": "Tap on the check-in button within the app", "ar": "اضغط على زر تسجيل الدخول داخل التطبيق"}, }; diff --git a/lib/models/Authentication/register_info_response.dart b/lib/models/Authentication/register_info_response.dart index 8a19e97b..1c8973d6 100644 --- a/lib/models/Authentication/register_info_response.dart +++ b/lib/models/Authentication/register_info_response.dart @@ -75,7 +75,7 @@ class RegisterInfoResponse { int? specialtyCode; dynamic specialtyNameAr; dynamic specialtyNameEn; - String? occupationID; + // String? occupationID; RegisterInfoResponse( {this.date, @@ -154,7 +154,8 @@ class RegisterInfoResponse { this.specialtyCode, this.specialtyNameAr, this.specialtyNameEn, - this.occupationID}); + // this.occupationID + }); RegisterInfoResponse.fromJson(Map json) { date = json['Date']; @@ -233,7 +234,7 @@ class RegisterInfoResponse { specialtyCode = json['specialtyCode']; specialtyNameAr = json['specialtyNameAr']; specialtyNameEn = json['specialtyNameEn']; - occupationID = json['OccupationID']; + // occupationID = json['OccupationID']; } Map toJson() { @@ -314,7 +315,7 @@ class RegisterInfoResponse { data['specialtyCode'] = this.specialtyCode; data['specialtyNameAr'] = this.specialtyNameAr; data['specialtyNameEn'] = this.specialtyNameEn; - data['OccupationID'] = this.occupationID; + // data['OccupationID'] = this.occupationID; return data; } } diff --git a/lib/models/Authentication/register_user_requet.dart b/lib/models/Authentication/register_user_requet.dart index ba362995..e436d6ef 100644 --- a/lib/models/Authentication/register_user_requet.dart +++ b/lib/models/Authentication/register_user_requet.dart @@ -16,7 +16,7 @@ class RegisterUserRequest { int? isHijri; String? healthId; String? zipCode; - String? occupationID; + // String? occupationID; RegisterUserRequest( {this.patientobject, @@ -36,7 +36,8 @@ class RegisterUserRequest { this.isHijri, this.healthId, this.zipCode, - this.occupationID}); + // this.occupationID + }); RegisterUserRequest.fromJson(Map json) { patientobject = json['Patientobject'] != null ? new Patientobject.fromJson(json['Patientobject']) : null; @@ -56,7 +57,7 @@ class RegisterUserRequest { isHijri = json['IsHijri']; healthId = json['HealthId']; zipCode = json['ZipCode']; - occupationID = json['OccupationID']; + // occupationID = json['OccupationID']; } Map toJson() { @@ -80,7 +81,7 @@ class RegisterUserRequest { data['IsHijri'] = this.isHijri; data['HealthId'] = this.healthId; data['ZipCode'] = this.zipCode; - data['OccupationID'] = this.occupationID; + // data['OccupationID'] = this.occupationID; return data; } } @@ -107,7 +108,7 @@ class Patientobject { String? sourceType; String? preferredLanguage; String? marital; - String? occupationID; + // String? occupationID; Patientobject( {this.tempValue, @@ -131,7 +132,8 @@ class Patientobject { this.sourceType, this.preferredLanguage, this.marital, - this.occupationID}); + // this.occupationID + }); Patientobject.fromJson(Map json) { tempValue = json['TempValue']; @@ -156,7 +158,7 @@ class Patientobject { preferredLanguage = json['PreferredLanguage']; marital = json['Marital']; - occupationID = json['OccupationID'] ?? ""; + // occupationID = json['OccupationID'] ?? ""; } Map toJson() { @@ -182,7 +184,7 @@ class Patientobject { data['SourceType'] = this.sourceType; data['PreferredLanguage'] = this.preferredLanguage; data['Marital'] = this.marital; - data['OccupationID'] = this.occupationID; + // data['OccupationID'] = this.occupationID; return data; } } diff --git a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart index f56e8a29..2109c92e 100644 --- a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart +++ b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart @@ -93,26 +93,26 @@ class _EROnlineCheckInHomePageState extends State with ), mHeight(6), Text( - "What is Online Check-In?", + TranslationBase.of(context).whatIsOnlineCheckIn, 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.", + TranslationBase.of(context).EROnlineCheckInDesc1, 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), - ), + // Text( + // TranslationBase.of(context).EROnlineCheckInHow, + // 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), + // ), ], ), ), @@ -164,7 +164,7 @@ class _EROnlineCheckInHomePageState extends State with Padding( padding: const EdgeInsets.only(left: 50, right: 50), child: Text( - "Tap On", + TranslationBase.of(context).EROnlineCheckInTapOn, maxLines: 1, style: TextStyle( fontSize: 20, @@ -178,8 +178,8 @@ class _EROnlineCheckInHomePageState extends State with 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), + TranslationBase.of(context).EROnlineCheckInTapOnCheckIn, + style: TextStyle(fontSize: 14, fontFamily: (projectViewModel.isArabic ? 'Cairo' : 'Poppins'), color: CustomColors.textDarkColor, letterSpacing: -1.44, height: 35 / 24), ), ), mHeight(16), @@ -210,7 +210,7 @@ class _EROnlineCheckInHomePageState extends State with Padding( padding: const EdgeInsets.only(left: 50, right: 50), child: Text( - "Hold your phone", + TranslationBase.of(context).EROnlineCheckInHoldPhone, maxLines: 1, style: TextStyle( fontSize: 20, @@ -224,8 +224,8 @@ class _EROnlineCheckInHomePageState extends State with 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), + TranslationBase.of(context).EROnlineCheckInHoldPhoneInstruction, + style: TextStyle(fontSize: 14, fontFamily: (projectViewModel.isArabic ? 'Cairo' : 'Poppins'), color: CustomColors.textDarkColor, letterSpacing: -1.44, height: 35 / 24), ), ), mHeight(16), @@ -241,7 +241,7 @@ class _EROnlineCheckInHomePageState extends State with child: Center( child: Text( "3", - style: TextStyle(fontSize: 22, fontWeight: FontWeight.w700, color: CustomColors.white, letterSpacing: -1.44, height: 35 / 24), + style: TextStyle(fontSize: 22, fontWeight: FontWeight.w700, color: CustomColors.white, letterSpacing: -1.44, height: 35 / 24), ), ), ), @@ -256,7 +256,7 @@ class _EROnlineCheckInHomePageState extends State with Padding( padding: const EdgeInsets.only(left: 50, right: 50), child: Text( - "Wait your turn", + TranslationBase.of(context).EROnlineCheckInWaitTurn, maxLines: 1, style: TextStyle( fontSize: 20, @@ -270,8 +270,8 @@ class _EROnlineCheckInHomePageState extends State with 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), + TranslationBase.of(context).EROnlineCheckInWaitTurnInstruction, + style: TextStyle(fontSize: 14, color: CustomColors.textDarkColor, fontFamily: (projectViewModel.isArabic ? 'Cairo' : 'Poppins'), letterSpacing: -1.44, height: 35 / 24), ), ), ], @@ -291,76 +291,76 @@ class _EROnlineCheckInHomePageState extends State with child: DefaultButton( TranslationBase.of(context).arrived, () { - showMyBottomSheet(context, - callBackFunc: () {}, - child: Padding( - padding: const EdgeInsets.all(21.0), - child: Column( - children: [ - Text(TranslationBase.of(context).scanQRHospital, - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w600, - letterSpacing: -0.48, - )), - mHeight(21), - GridView( - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: (MediaQuery.of(context).size.width < 550) ? 3 : 5, childAspectRatio: 1 / 1, crossAxisSpacing: 8, mainAxisSpacing: 12), - children: [ - attendanceMethod(TranslationBase.of(context).scanNFC, "assets/images/nfc/contactless.svg", true, () { - 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); - } - }), - attendanceMethod(TranslationBase.of(context).pharmaLiveCareScanQR, "assets/images/new/services/qr_code.svg", true, () async { - String onlineCheckInQRCode = (await BarcodeScanner.scan().then((value) => value.rawContent)); - if (onlineCheckInQRCode != "") { - print(onlineCheckInQRCode); - getProjectIDFromNFC(onlineCheckInQRCode, true); - // sendNfcCheckInRequest(onlineCheckInQRCode, 2); - } else {} - }), - attendanceMethod(TranslationBase.of(context).checkInViaLocation, "assets/images/new/services/location.svg", true, () {}) - ], - ), - ], - ), - )); + // showMyBottomSheet(context, + // callBackFunc: () {}, + // child: Padding( + // padding: const EdgeInsets.all(21.0), + // child: Column( + // children: [ + // Text(TranslationBase.of(context).scanQRHospital, + // style: TextStyle( + // fontSize: 20, + // fontWeight: FontWeight.w600, + // letterSpacing: -0.48, + // )), + // mHeight(21), + // GridView( + // physics: const NeverScrollableScrollPhysics(), + // shrinkWrap: true, + // gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + // crossAxisCount: (MediaQuery.of(context).size.width < 550) ? 3 : 5, childAspectRatio: 1 / 1, crossAxisSpacing: 8, mainAxisSpacing: 12), + // children: [ + // attendanceMethod(TranslationBase.of(context).scanNFC, "assets/images/nfc/contactless.svg", true, () { + // 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); + // } + // }), + // attendanceMethod(TranslationBase.of(context).pharmaLiveCareScanQR, "assets/images/new/services/qr_code.svg", true, () async { + // String onlineCheckInQRCode = (await BarcodeScanner.scan().then((value) => value.rawContent)); + // if (onlineCheckInQRCode != "") { + // print(onlineCheckInQRCode); + // getProjectIDFromNFC(onlineCheckInQRCode, true); + // // sendNfcCheckInRequest(onlineCheckInQRCode, 2); + // } else {} + // }), + // attendanceMethod(TranslationBase.of(context).checkInViaLocation, "assets/images/new/services/location.svg", true, () {}) + // ], + // ), + // ], + // ), + // )); // Navigator.push(context, FadePage(page: EROnlineCheckInNFCQRLocation(projectID: 15))).then((value) {}); - // 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); - // } + 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, ), diff --git a/lib/pages/login/register-info.dart b/lib/pages/login/register-info.dart index 2c6cb4b0..c2c78182 100644 --- a/lib/pages/login/register-info.dart +++ b/lib/pages/login/register-info.dart @@ -92,10 +92,8 @@ class _RegisterInfo extends State { String nationality = 'SAU'; String selectedOccupationID = ""; - List patientOccupationList = []; - - // - GetPatientOccupationListResponse? selectedPatientOccupation; + // List patientOccupationList = []; + // GetPatientOccupationListResponse? selectedPatientOccupation; final GlobalKey projectDropdownKey = GlobalKey(); @@ -273,71 +271,71 @@ class _RegisterInfo extends State { ? Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - (!isDubai) - ? 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).selectOccupation, - style: TextStyle( - fontSize: 11, - letterSpacing: -0.44, - fontWeight: FontWeight.w600, - ), - ), - Container( - height: 18, - width: double.infinity, - child: DropdownButtonHideUnderline( - child: DropdownButton( - key: projectDropdownKey, - hint: Text(TranslationBase.of(context).selectOccupation), - value: selectedPatientOccupation, - iconSize: 0, - isExpanded: true, - style: TextStyle(fontSize: 14, letterSpacing: -0.56, color: Colors.black), - items: patientOccupationList.map((GetPatientOccupationListResponse item) { - return DropdownMenuItem( - value: item, - child: AutoSizeText( - projectViewModel.isArabic ? item.descriptionN! : item.description!, - maxLines: 1, - minFontSize: 10, - style: TextStyle( - fontSize: SizeConfig.textMultiplier! * 1.6, - fontWeight: FontWeight.w600, - letterSpacing: -0.39, - height: 0.8, - ), - ), - // Text('${item.name!}'), - ); - }).toList(), - onChanged: (GetPatientOccupationListResponse? newValue) { - setState(() { - selectedPatientOccupation = newValue!; - selectedOccupationID = selectedPatientOccupation!.occupationID!; - registerInfo.occupationID = selectedOccupationID; - }); - debugPrint("Selected Occupation ID: ${registerInfo.occupationID}"); - }, - ), - ), - ), - ], - ), - ), - Icon(Icons.keyboard_arrow_down), - ], - )) - : SizedBox(), + // (!isDubai) + // ? 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).selectOccupation, + // style: TextStyle( + // fontSize: 11, + // letterSpacing: -0.44, + // fontWeight: FontWeight.w600, + // ), + // ), + // Container( + // height: 18, + // width: double.infinity, + // child: DropdownButtonHideUnderline( + // child: DropdownButton( + // key: projectDropdownKey, + // hint: Text(TranslationBase.of(context).selectOccupation), + // value: selectedPatientOccupation, + // iconSize: 0, + // isExpanded: true, + // style: TextStyle(fontSize: 14, letterSpacing: -0.56, color: Colors.black), + // items: patientOccupationList.map((GetPatientOccupationListResponse item) { + // return DropdownMenuItem( + // value: item, + // child: AutoSizeText( + // projectViewModel.isArabic ? item.descriptionN! : item.description!, + // maxLines: 1, + // minFontSize: 10, + // style: TextStyle( + // fontSize: SizeConfig.textMultiplier! * 1.6, + // fontWeight: FontWeight.w600, + // letterSpacing: -0.39, + // height: 0.8, + // ), + // ), + // // Text('${item.name!}'), + // ); + // }).toList(), + // onChanged: (GetPatientOccupationListResponse? newValue) { + // setState(() { + // selectedPatientOccupation = newValue!; + // selectedOccupationID = selectedPatientOccupation!.occupationID!; + // registerInfo.occupationID = selectedOccupationID; + // }); + // debugPrint("Selected Occupation ID: ${registerInfo.occupationID}"); + // }, + // ), + // ), + // ), + // ], + // ), + // ), + // Icon(Icons.keyboard_arrow_down), + // ], + // )) + // : SizedBox(), mHeight(20), Container( width: double.infinity, @@ -513,15 +511,17 @@ class _RegisterInfo extends State { widget.changePageViewIndex!(2); } } else { - if (isDubai) { - registerNow(); - } else { - if (selectedPatientOccupation != null) { - registerNow(); - } else { - AppToast.showErrorToast(message: TranslationBase.of(context).selectOccupationError); - } - } + registerNow(); + + // if (isDubai) { + // registerNow(); + // } else { + // if (selectedPatientOccupation != null) { + // registerNow(); + // } else { + // AppToast.showErrorToast(message: TranslationBase.of(context).selectOccupationError); + // } + // } } } @@ -624,15 +624,15 @@ class _RegisterInfo extends State { }); } - try { - var patientOccupationListVal = json.decode(await sharedPref.getString(PATIENT_OCCUPATION_LIST)); - patientOccupationListVal.forEach((v) { - patientOccupationList.add(new GetPatientOccupationListResponse.fromJson(v)); - }); - setState(() {}); - } catch (ex) { - print(ex.toString()); - } + // try { + // var patientOccupationListVal = json.decode(await sharedPref.getString(PATIENT_OCCUPATION_LIST)); + // patientOccupationListVal.forEach((v) { + // patientOccupationList.add(new GetPatientOccupationListResponse.fromJson(v)); + // }); + // setState(() {}); + // } catch (ex) { + // print(ex.toString()); + // } } getTempUserRequest() { @@ -662,7 +662,7 @@ class _RegisterInfo extends State { "EmailAddress": email, "SourceType": location, "PreferredLanguage": registerd_data.languageID.toString(), - "OccupationID": registerInfo.occupationID, + // "OccupationID": registerInfo.occupationID, "Marital": registerInfo.maritalStatusCode == 'U' ? '0' : registerInfo.maritalStatusCode == 'M' diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 4f2fbce0..f3ed60f6 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -3025,6 +3025,17 @@ class TranslationBase { String get labResultFlag => localizedValues["labResultFlag"][locale.languageCode]; String get selectOccupation => localizedValues["selectOccupation"][locale.languageCode]; String get selectOccupationError => localizedValues["selectOccupationError"][locale.languageCode]; + + String get whatIsOnlineCheckIn => localizedValues["whatIsOnlineCheckIn"][locale.languageCode]; + String get EROnlineCheckInDesc1 => localizedValues["EROnlineCheckInDesc1"][locale.languageCode]; + String get EROnlineCheckInHow => localizedValues["EROnlineCheckInHow"][locale.languageCode]; + String get EROnlineCheckInTapOn => localizedValues["EROnlineCheckInTapOn"][locale.languageCode]; + String get EROnlineCheckInTapOnCheckIn => localizedValues["EROnlineCheckInTapOnCheckIn"][locale.languageCode]; + String get EROnlineCheckInHoldPhone => localizedValues["EROnlineCheckInHoldPhone"][locale.languageCode]; + String get EROnlineCheckInHoldPhoneInstruction => localizedValues["EROnlineCheckInHoldPhoneInstruction"][locale.languageCode]; + String get EROnlineCheckInWaitTurn => localizedValues["EROnlineCheckInWaitTurn"][locale.languageCode]; + String get EROnlineCheckInWaitTurnInstruction => localizedValues["EROnlineCheckInWaitTurnInstruction"][locale.languageCode]; + } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart b/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart index 3eb9b86a..db908230 100644 --- a/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart +++ b/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart @@ -161,8 +161,9 @@ class LabResultWidget extends StatelessWidget { Utils.tableColumnTitle(TranslationBase.of(context).description, showDivider: false), Utils.tableColumnTitle(TranslationBase.of(context).value, showDivider: false), // Utils.tableColumnTitle(TranslationBase.of(context).unit, showDivider: false), - Utils.tableColumnTitle(TranslationBase.of(context).labResultFlag, showDivider: false), + // Utils.tableColumnTitle(TranslationBase.of(context).labResultFlag, showDivider: false), Utils.tableColumnTitle(TranslationBase.of(context).range, showDivider: false), + Utils.tableColumnTitle("", showDivider: false), ], ), ); @@ -186,15 +187,25 @@ class LabResultWidget extends StatelessWidget { padding: EdgeInsets.only(left: projectViewModel.isArabic ? 0 : 12, right: projectViewModel.isArabic ? 12 : 0), child: Utils.tableColumnValue(labResultList[i].description ?? "", isLast: true, mProjectViewModel: projectViewModel), ), + Utils.tableColumnValue(labResultList[i].resultValue! + " " + labResultList[i].uOM!, - isHighLow: ((labResultList[i].resultValueFlag ?? "").toLowerCase() == "h" || (labResultList[i].resultValueFlag ?? "").toLowerCase() == "l"), + // isHighLow: ((labResultList[i].resultValueFlag ?? "").toLowerCase() == "h" || (labResultList[i].resultValueFlag ?? "").toLowerCase() == "l"), isLast: true, mProjectViewModel: projectViewModel), - Utils.tableColumnValue((labResultList[i].resultValueFlag ?? ""), - isHighLow: ((labResultList[i].resultValueFlag ?? "").toLowerCase() == "h" || (labResultList[i].resultValueFlag ?? "").toLowerCase() == "l"), + + + // Utils.tableColumnValue((labResultList[i].resultValueFlag ?? ""), + // isHighLow: ((labResultList[i].resultValueFlag ?? "").toLowerCase() == "h" || (labResultList[i].resultValueFlag ?? "").toLowerCase() == "l"), + // isLast: true, + // isCapitable: false, + // mProjectViewModel: projectViewModel), + + Utils.tableColumnValue((labResultList[i].referanceRange! ?? ""), + // isHighLow: ((labResultList[i].resultValueFlag ?? "").toLowerCase() == "h" || (labResultList[i].resultValueFlag ?? "").toLowerCase() == "l"), isLast: true, isCapitable: false, mProjectViewModel: projectViewModel), + !checkIfCovidLab(patientLabResultList!) ? InkWell( onTap: () { @@ -210,7 +221,8 @@ class LabResultWidget extends StatelessWidget { }, child: Padding( padding: EdgeInsets.only(left: !projectViewModel.isArabic ? 0 : 12, right: !projectViewModel.isArabic ? 12 : 0), - child: Utils.tableColumnValueWithFlowChart(labResultList[i].referanceRange!, TranslationBase.of(context).viewFlowChart, isLast: true, isCapitable: false), + // child: Utils.tableColumnValueWithFlowChart(labResultList[i].referanceRange!, TranslationBase.of(context).viewFlowChart, isLast: true, isCapitable: false), + child: Utils.tableColumnValueWithUnderLine(TranslationBase.of(context).viewFlowChart, isLast: true, isCapitable: false), ), ) : Container(), diff --git a/lib/widgets/in_app_browser/InAppBrowser.dart b/lib/widgets/in_app_browser/InAppBrowser.dart index 6f61ac8a..ee68f743 100644 --- a/lib/widgets/in_app_browser/InAppBrowser.dart +++ b/lib/widgets/in_app_browser/InAppBrowser.dart @@ -38,9 +38,9 @@ class MyInAppBrowser extends InAppBrowser { static String APPLE_PAY_PAYFORT_URL = 'https://hmgwebservices.com/PayFortWebLive/PayFortApi/MakeApplePayRequest'; // Payfort Payment Gateway URL LIVE // static String APPLE_PAY_PAYFORT_URL = 'https://hmgwebservices.com/PayFortWebLive/PayFortApi/MakeApplePayRequest'; // Payfort Payment Gateway URL UAT - static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; // Payfort Payment Gateway URL UAT + // static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; // Payfort Payment Gateway URL UAT - // static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWebLive/pages/SendPayFortRequest.aspx'; //Payfort Payment Gateway URL LIVE + static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWebLive/pages/SendPayFortRequest.aspx'; //Payfort Payment Gateway URL LIVE // static String SERVICE_URL = 'https://uat.hmgwebservices.com/payfortforvidaplus/pages/SendPayFortRequest.aspx'; //Payfort Payment Gateway URL UAT VIDA PLUS From 65d7f3f9b9561c7e996185339809ff70d281b999 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Sun, 22 Dec 2024 14:16:28 +0300 Subject: [PATCH 27/31] Font family fixes --- .../fonts/ar/Cairo-Regular/Cairo-Regular.ttf | Bin 0 -> 170464 bytes lib/config/config.dart | 8 ++++---- .../EROnlineCheckIn/EROnlineCheckInHome.dart | 9 +++++---- pubspec.yaml | 6 ++++++ 4 files changed, 15 insertions(+), 8 deletions(-) create mode 100644 assets/fonts/ar/Cairo-Regular/Cairo-Regular.ttf diff --git a/assets/fonts/ar/Cairo-Regular/Cairo-Regular.ttf b/assets/fonts/ar/Cairo-Regular/Cairo-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3eb09f860b2a4669db473d745278f7cc3b690a0b GIT binary patch literal 170464 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

V!!El+Qn2RPBD=H?W;nienK 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 VDcvL0Vp4fdtH~kl$d?J7{|6!0H(~$) literal 0 HcmV?d00001 diff --git a/lib/config/config.dart b/lib/config/config.dart index be94c94c..4311ef6d 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -697,10 +697,10 @@ var GET_PATIENT_OCCUPATION_LIST = 'Services/Authentication.svc/REST/GetPatientOc //PAYFORT var getPayFortProjectDetails = "Services/PayFort_Serv.svc/REST/GetPayFortProjectDetails"; var addPayFortApplePayResponse = "Services/PayFort_Serv.svc/REST/AddResponse"; -// var payFortEnvironment = FortEnvironment.production; -// var applePayMerchantId = "merchant.com.hmgwebservices"; -var payFortEnvironment = FortEnvironment.test; -var applePayMerchantId = "merchant.com.hmgwebservices.uat"; +var payFortEnvironment = FortEnvironment.production; +var applePayMerchantId = "merchant.com.hmgwebservices"; +// var payFortEnvironment = FortEnvironment.test; +// var applePayMerchantId = "merchant.com.hmgwebservices.uat"; class AppGlobal { static var context; diff --git a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart index 2109c92e..898eaf2e 100644 --- a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart +++ b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart @@ -98,9 +98,10 @@ class _EROnlineCheckInHomePageState extends State with style: TextStyle( fontSize: 20, fontFamily: (projectViewModel.isArabic ? 'Cairo' : 'Poppins'), fontWeight: FontWeight.w700, color: Color(0xff2B353E), letterSpacing: -1.44, height: 35 / 24), ), + mHeight(12), Text( TranslationBase.of(context).EROnlineCheckInDesc1, - style: TextStyle(fontSize: 14, color: CustomColors.textDarkColor, letterSpacing: -1.44, height: 35 / 24), + style: TextStyle(fontSize: 13, fontFamily: (projectViewModel.isArabic ? 'Cairo' : 'Poppins'), fontWeight: FontWeight.w700, color: CustomColors.textDarkColor, letterSpacing: -1.44, height: 35 / 24), ), mHeight(16), // Text( @@ -179,7 +180,7 @@ class _EROnlineCheckInHomePageState extends State with padding: const EdgeInsets.only(left: 50, right: 50), child: Text( TranslationBase.of(context).EROnlineCheckInTapOnCheckIn, - style: TextStyle(fontSize: 14, fontFamily: (projectViewModel.isArabic ? 'Cairo' : 'Poppins'), color: CustomColors.textDarkColor, letterSpacing: -1.44, height: 35 / 24), + style: TextStyle(fontSize: 13, fontFamily: (projectViewModel.isArabic ? 'Cairo' : 'Poppins'), fontWeight: FontWeight.w700, color: CustomColors.textDarkColor, letterSpacing: -1.44, height: 35 / 24), ), ), mHeight(16), @@ -225,7 +226,7 @@ class _EROnlineCheckInHomePageState extends State with padding: const EdgeInsets.only(left: 50, right: 50), child: Text( TranslationBase.of(context).EROnlineCheckInHoldPhoneInstruction, - style: TextStyle(fontSize: 14, fontFamily: (projectViewModel.isArabic ? 'Cairo' : 'Poppins'), color: CustomColors.textDarkColor, letterSpacing: -1.44, height: 35 / 24), + style: TextStyle(fontSize: 13, fontFamily: (projectViewModel.isArabic ? 'Cairo' : 'Poppins'), fontWeight: FontWeight.w700, color: CustomColors.textDarkColor, letterSpacing: -1.44, height: 35 / 24), ), ), mHeight(16), @@ -271,7 +272,7 @@ class _EROnlineCheckInHomePageState extends State with padding: const EdgeInsets.only(left: 50, right: 50), child: Text( TranslationBase.of(context).EROnlineCheckInWaitTurnInstruction, - style: TextStyle(fontSize: 14, color: CustomColors.textDarkColor, fontFamily: (projectViewModel.isArabic ? 'Cairo' : 'Poppins'), letterSpacing: -1.44, height: 35 / 24), + style: TextStyle(fontSize: 13, color: CustomColors.textDarkColor, fontWeight: FontWeight.w700, fontFamily: (projectViewModel.isArabic ? 'Cairo' : 'Poppins'), letterSpacing: -1.44, height: 35 / 24), ), ), ], diff --git a/pubspec.yaml b/pubspec.yaml index 7b43a711..26b406e4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -257,6 +257,12 @@ flutter: - asset: assets/fonts/ar/Cairo-Light/Cairo-Light.woff weight: 300 +# - asset: assets/fonts/ar/Cairo-Light/Cairo-Light.eot +# - asset: assets/fonts/ar/Cairo-Light/Cairo-Light.otf + - asset: assets/fonts/ar/Cairo-Regular/Cairo-Regular.ttf +# - asset: assets/fonts/ar/Cairo-Light/Cairo-Light.woff + weight: 400 + - asset: assets/fonts/ar/Cairo-Bold/Cairo-Bold.eot - asset: assets/fonts/ar/Cairo-Bold/Cairo-Bold.otf - asset: assets/fonts/ar/Cairo-Bold/Cairo-Bold.ttf From 6f0f422adf78522ec98f795181d7de08fbf6d796 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 23 Dec 2024 12:54:34 +0300 Subject: [PATCH 28/31] CheckIn button removed as per Mr Rwaid's instructions. --- .../EROnlineCheckIn/EROnlineCheckInHome.dart | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart index 898eaf2e..d1ecc3ad 100644 --- a/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart +++ b/lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart @@ -180,7 +180,7 @@ class _EROnlineCheckInHomePageState extends State with padding: const EdgeInsets.only(left: 50, right: 50), child: Text( TranslationBase.of(context).EROnlineCheckInTapOnCheckIn, - style: TextStyle(fontSize: 13, fontFamily: (projectViewModel.isArabic ? 'Cairo' : 'Poppins'), fontWeight: FontWeight.w700, color: CustomColors.textDarkColor, letterSpacing: -1.44, height: 35 / 24), + style: TextStyle(fontSize: 13, fontFamily: (projectViewModel.isArabic ? 'Cairo' : 'Poppins'), fontWeight: FontWeight.w600, color: CustomColors.textDarkColor, letterSpacing: -1.44, height: 35 / 24), ), ), mHeight(16), @@ -226,7 +226,7 @@ class _EROnlineCheckInHomePageState extends State with padding: const EdgeInsets.only(left: 50, right: 50), child: Text( TranslationBase.of(context).EROnlineCheckInHoldPhoneInstruction, - style: TextStyle(fontSize: 13, fontFamily: (projectViewModel.isArabic ? 'Cairo' : 'Poppins'), fontWeight: FontWeight.w700, color: CustomColors.textDarkColor, letterSpacing: -1.44, height: 35 / 24), + style: TextStyle(fontSize: 13, fontFamily: (projectViewModel.isArabic ? 'Cairo' : 'Poppins'), fontWeight: FontWeight.w600, color: CustomColors.textDarkColor, letterSpacing: -1.44, height: 35 / 24), ), ), mHeight(16), @@ -272,7 +272,7 @@ class _EROnlineCheckInHomePageState extends State with padding: const EdgeInsets.only(left: 50, right: 50), child: Text( TranslationBase.of(context).EROnlineCheckInWaitTurnInstruction, - style: TextStyle(fontSize: 13, color: CustomColors.textDarkColor, fontWeight: FontWeight.w700, fontFamily: (projectViewModel.isArabic ? 'Cairo' : 'Poppins'), letterSpacing: -1.44, height: 35 / 24), + style: TextStyle(fontSize: 13, color: CustomColors.textDarkColor, fontWeight: FontWeight.w600, fontFamily: (projectViewModel.isArabic ? 'Cairo' : 'Poppins'), letterSpacing: -1.44, height: 35 / 24), ), ), ], @@ -368,33 +368,33 @@ class _EROnlineCheckInHomePageState extends State with ) : Row( children: [ - Expanded( - flex: 1, - child: DefaultButton( - TranslationBase.of(context).checkinOptions, - () { - // Navigator.push(context, FadePage(page: EROnlineCheckInNFCQRLocation(projectID: 15))).then((value) {}); - - 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, localContext: context); - } - }, - color: CustomColors.green, - ), - ), - mWidth(12), + // Expanded( + // flex: 1, + // child: DefaultButton( + // TranslationBase.of(context).checkinOptions, + // () { + // // Navigator.push(context, FadePage(page: EROnlineCheckInNFCQRLocation(projectID: 15))).then((value) {}); + // + // 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, localContext: context); + // } + // }, + // color: CustomColors.green, + // ), + // ), + // mWidth(12), Expanded( flex: 1, child: DefaultButton( From ab33d06b91d99b69a225daf90712121b67ace558 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Thu, 26 Dec 2024 16:39:46 +0300 Subject: [PATCH 29/31] Fix for VIDA4 Lab Special Result --- .../medical/LabResult/laboratory_result_widget.dart | 9 +++------ pubspec.yaml | 4 +++- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/widgets/data_display/medical/LabResult/laboratory_result_widget.dart b/lib/widgets/data_display/medical/LabResult/laboratory_result_widget.dart index 1ceca02f..6ad54a8f 100644 --- a/lib/widgets/data_display/medical/LabResult/laboratory_result_widget.dart +++ b/lib/widgets/data_display/medical/LabResult/laboratory_result_widget.dart @@ -10,6 +10,7 @@ import 'package:diplomaticquarterapp/widgets/others/network_base_view.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_html/flutter_html.dart'; +import 'package:flutter_widget_from_html/flutter_widget_from_html.dart'; import 'package:provider/provider.dart'; import 'LabResultWidget.dart'; @@ -179,12 +180,8 @@ class _LaboratoryResultWidgetState extends State { ), if (_isShowMore) Container( - width: double.infinity, - // height: 450.0, - child: Html( - // data: widget.details ?? TranslationBase.of(context).noDataAvailable, - data: labSpecialResult, - ), + width: MediaQuery.of(context).size.width * 0.9, + child: HtmlWidget(labSpecialResult), ), ], ), diff --git a/pubspec.yaml b/pubspec.yaml index 26b406e4..ddaab056 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: diplomaticquarterapp description: A new Flutter application. -version: 4.5.073+4050073 +version: 4.5.074+4050074 environment: sdk: ">=3.0.0 <3.13.0" @@ -51,6 +51,8 @@ dependencies: # Flutter Html View flutter_html: ^3.0.0-beta.2 + flutter_widget_from_html: ^0.15.3 + # Pagnation pull_to_refresh: ^2.0.0 From e0de0768b69ef1c82abc72f700748d4c7232d3ad Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 6 Jan 2025 10:58:58 +0300 Subject: [PATCH 30/31] CR 7241 changes, ProjectID added in radiology results if navigating from appointment details --- lib/main.dart | 10 +++---- .../widgets/AppointmentActions.dart | 2 +- .../appointment_services/GetDoctorsList.dart | 3 ++- lib/splashPage.dart | 2 +- lib/uitl/utils.dart | 2 -- .../medical/LabResult/LabResultWidget.dart | 27 ++++++++++--------- 6 files changed, 23 insertions(+), 23 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 815bea40..cd2aab7a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -31,13 +31,13 @@ void main() async { await Firebase.initializeApp(); // Pass all uncaught "fatal" errors from the framework to Crashlytics - FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterFatalError; + // FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterFatalError; // Pass all uncaught asynchronous errors that aren't handled by the Flutter framework to Crashlytics - PlatformDispatcher.instance.onError = (error, stack) { - if (!kDebugMode) FirebaseCrashlytics.instance.recordError(error, stack, fatal: true); - return true; - }; + // PlatformDispatcher.instance.onError = (error, stack) { + // if (!kDebugMode) FirebaseCrashlytics.instance.recordError(error, stack, fatal: true); + // return true; + // }; setupLocator(); HttpOverrides.global = MyHttpOverrides(); diff --git a/lib/pages/MyAppointments/widgets/AppointmentActions.dart b/lib/pages/MyAppointments/widgets/AppointmentActions.dart index 61fddab8..d29030a1 100644 --- a/lib/pages/MyAppointments/widgets/AppointmentActions.dart +++ b/lib/pages/MyAppointments/widgets/AppointmentActions.dart @@ -439,7 +439,7 @@ class _AppointmentActionsState extends State { GifLoaderDialogUtils.showMyDialog(context); DoctorsListService service = new DoctorsListService(); FinalRadiology finalRadiology = new FinalRadiology(); - service.getPatientRadOrders(widget.appo.appointmentNo.toString(), languageID, context).then((res) { + service.getPatientRadOrders(widget.appo.appointmentNo.toString(), widget.appo.projectID, languageID, context).then((res) { GifLoaderDialogUtils.hideDialog(context); if (res['FinalRadiologyList'] != null) { print(res['FinalRadiologyList']); diff --git a/lib/services/appointment_services/GetDoctorsList.dart b/lib/services/appointment_services/GetDoctorsList.dart index 2b039701..943f2112 100644 --- a/lib/services/appointment_services/GetDoctorsList.dart +++ b/lib/services/appointment_services/GetDoctorsList.dart @@ -1285,7 +1285,7 @@ class DoctorsListService extends BaseService { return Future.value(localRes); } - Future getPatientRadOrders(String appoNo, int languageID, BuildContext context) async { + Future getPatientRadOrders(String appoNo, int projectID, int languageID, BuildContext context) async { Map request; if (await this.sharedPref.getObject(USER_PROFILE) != null) { var data = AuthenticatedUser.fromJson(await this.sharedPref.getObject(USER_PROFILE)); @@ -1295,6 +1295,7 @@ class DoctorsListService extends BaseService { Request req = appGlobal.getPublicRequest(); request = { "AppointmentNo": appoNo, + "ProjectID": projectID, "VersionID": req.VersionID, "Channel": req.Channel, "IPAdress": req.IPAdress, diff --git a/lib/splashPage.dart b/lib/splashPage.dart index 533456ee..c0ff2eb2 100644 --- a/lib/splashPage.dart +++ b/lib/splashPage.dart @@ -86,7 +86,7 @@ class _SplashScreenState extends State { // debugPrint("ALL SHARED PREFERENCES!!!!!"); // debugPrint(jsonEncode(value)); }); - if (!kDebugMode) await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); + // if (!kDebugMode) await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true); // PushNotificationHandler(context).init(); // Asyncronously } diff --git a/lib/uitl/utils.dart b/lib/uitl/utils.dart index ebe33ac9..2dc03b03 100644 --- a/lib/uitl/utils.dart +++ b/lib/uitl/utils.dart @@ -849,14 +849,12 @@ class Utils { } static Widget tableColumnValueWithFlowChart(String text, String flowChartText, {bool isLast = false, bool isCapitable = true, ProjectViewModel? mProjectViewModel}) { - ProjectViewModel projectViewModel = mProjectViewModel ?? Provider.of(AppGlobal.context); return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ SizedBox(height: 12), Text( - // isCapitable && !projectViewModel.isArabic ? text.toLowerCase().capitalizeFirstofEach : text, text, maxLines: 2, overflow: TextOverflow.ellipsis, diff --git a/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart b/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart index db908230..eb196499 100644 --- a/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart +++ b/lib/widgets/data_display/medical/LabResult/LabResultWidget.dart @@ -161,9 +161,10 @@ class LabResultWidget extends StatelessWidget { Utils.tableColumnTitle(TranslationBase.of(context).description, showDivider: false), Utils.tableColumnTitle(TranslationBase.of(context).value, showDivider: false), // Utils.tableColumnTitle(TranslationBase.of(context).unit, showDivider: false), - // Utils.tableColumnTitle(TranslationBase.of(context).labResultFlag, showDivider: false), + Utils.tableColumnTitle(TranslationBase.of(context).labResultFlag, showDivider: false), + Utils.tableColumnTitle(TranslationBase.of(context).range, showDivider: false), - Utils.tableColumnTitle("", showDivider: false), + // Utils.tableColumnTitle("", showDivider: false), ], ), ); @@ -189,23 +190,23 @@ class LabResultWidget extends StatelessWidget { ), Utils.tableColumnValue(labResultList[i].resultValue! + " " + labResultList[i].uOM!, - // isHighLow: ((labResultList[i].resultValueFlag ?? "").toLowerCase() == "h" || (labResultList[i].resultValueFlag ?? "").toLowerCase() == "l"), + isHighLow: ((labResultList[i].resultValueFlag ?? "").toLowerCase() == "h" || (labResultList[i].resultValueFlag ?? "").toLowerCase() == "l"), isLast: true, mProjectViewModel: projectViewModel), - // Utils.tableColumnValue((labResultList[i].resultValueFlag ?? ""), - // isHighLow: ((labResultList[i].resultValueFlag ?? "").toLowerCase() == "h" || (labResultList[i].resultValueFlag ?? "").toLowerCase() == "l"), - // isLast: true, - // isCapitable: false, - // mProjectViewModel: projectViewModel), - - Utils.tableColumnValue((labResultList[i].referanceRange! ?? ""), - // isHighLow: ((labResultList[i].resultValueFlag ?? "").toLowerCase() == "h" || (labResultList[i].resultValueFlag ?? "").toLowerCase() == "l"), + Utils.tableColumnValue((labResultList[i].resultValueFlag ?? ""), + isHighLow: ((labResultList[i].resultValueFlag ?? "").toLowerCase() == "h" || (labResultList[i].resultValueFlag ?? "").toLowerCase() == "l"), isLast: true, isCapitable: false, mProjectViewModel: projectViewModel), + // Utils.tableColumnValue((labResultList[i].referanceRange! ?? ""), + // // isHighLow: ((labResultList[i].resultValueFlag ?? "").toLowerCase() == "h" || (labResultList[i].resultValueFlag ?? "").toLowerCase() == "l"), + // isLast: true, + // isCapitable: false, + // mProjectViewModel: projectViewModel), + !checkIfCovidLab(patientLabResultList!) ? InkWell( onTap: () { @@ -221,8 +222,8 @@ class LabResultWidget extends StatelessWidget { }, child: Padding( padding: EdgeInsets.only(left: !projectViewModel.isArabic ? 0 : 12, right: !projectViewModel.isArabic ? 12 : 0), - // child: Utils.tableColumnValueWithFlowChart(labResultList[i].referanceRange!, TranslationBase.of(context).viewFlowChart, isLast: true, isCapitable: false), - child: Utils.tableColumnValueWithUnderLine(TranslationBase.of(context).viewFlowChart, isLast: true, isCapitable: false), + child: Utils.tableColumnValueWithFlowChart(labResultList[i].referanceRange!, TranslationBase.of(context).viewFlowChart, isLast: true, isCapitable: false), + // child: Utils.tableColumnValueWithUnderLine(TranslationBase.of(context).viewFlowChart, isLast: true, isCapitable: false), ), ) : Container(), From 0e73d6d23ec5f1fb5a8a057e3b95723dfe58a71a Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 6 Jan 2025 11:02:08 +0300 Subject: [PATCH 31/31] updates --- lib/config/config.dart | 8 +- lib/core/service/client/base_app_client.dart | 2 +- .../login/user-login-agreement-page.dart | 76 ++++++++++++++----- lib/widgets/in_app_browser/InAppBrowser.dart | 4 +- 4 files changed, 64 insertions(+), 26 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index 4311ef6d..be94c94c 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -697,10 +697,10 @@ var GET_PATIENT_OCCUPATION_LIST = 'Services/Authentication.svc/REST/GetPatientOc //PAYFORT var getPayFortProjectDetails = "Services/PayFort_Serv.svc/REST/GetPayFortProjectDetails"; var addPayFortApplePayResponse = "Services/PayFort_Serv.svc/REST/AddResponse"; -var payFortEnvironment = FortEnvironment.production; -var applePayMerchantId = "merchant.com.hmgwebservices"; -// var payFortEnvironment = FortEnvironment.test; -// var applePayMerchantId = "merchant.com.hmgwebservices.uat"; +// var payFortEnvironment = FortEnvironment.production; +// var applePayMerchantId = "merchant.com.hmgwebservices"; +var payFortEnvironment = FortEnvironment.test; +var applePayMerchantId = "merchant.com.hmgwebservices.uat"; class AppGlobal { static var context; diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index 2f836dbf..db0ee615 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -187,7 +187,7 @@ class BaseAppClient { // body['IdentificationNo'] = 1023854217; // body['MobileNo'] = "531940021"; //0560717232 - // body['PatientID'] = 1231755; //4609100 + // body['PatientID'] = 1058229; //4609100 // body['TokenID'] = "@dm!n"; // Patient ID: 3027574 diff --git a/lib/pages/login/user-login-agreement-page.dart b/lib/pages/login/user-login-agreement-page.dart index f01a0c96..a8df31fe 100644 --- a/lib/pages/login/user-login-agreement-page.dart +++ b/lib/pages/login/user-login-agreement-page.dart @@ -20,6 +20,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_html/flutter_html.dart'; import 'package:provider/provider.dart'; +import 'package:webview_flutter/webview_flutter.dart'; class UserLoginAgreementPage extends StatefulWidget { final String userAgreementText; @@ -38,6 +39,38 @@ class _UserLoginAgreementPageState extends State { late ToDoCountProviderModel toDoProvider; final authService = AuthProvider(); + late final WebViewController _controller; + bool isPageLoaded = false; + + @override + void initState() { + super.initState(); + _controller = WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setNavigationDelegate( + NavigationDelegate( + onProgress: (int progress) { + // Update loading bar. + }, + onPageStarted: (String url) {}, + onPageFinished: (String url) { + setState(() { + isPageLoaded = true; + }); + }, + onHttpError: (HttpResponseError error) {}, + onWebResourceError: (WebResourceError error) {}, + onNavigationRequest: (NavigationRequest request) { + if (request.url.startsWith('https://www.youtube.com/')) { + return NavigationDecision.prevent; + } + return NavigationDecision.navigate; + }, + ), + ) + ..loadRequest(Uri.parse("https://hmg.com/en/Pages/Privacy.aspx")); + } + @override Widget build(BuildContext context) { projectViewModel = Provider.of(context); @@ -49,14 +82,15 @@ class _UserLoginAgreementPageState extends State { showNewAppBar: true, isShowDecPage: false, appBarTitle: TranslationBase.of(context).userAgreement, - body: Padding( - padding: const EdgeInsets.all(8.0), - child: SingleChildScrollView( - child: Html( - data: widget.userAgreementText, - ), - ), - ), + body: WebViewWidget(controller: _controller), + // Padding( + // padding: const EdgeInsets.all(8.0), + // child: SingleChildScrollView(child: WebViewWidget(controller: _controller) + // // Html( + // // data: widget.userAgreementText, + // // ), + // ), + // ), bottomSheet: Container( decoration: BoxDecoration( color: Colors.white, @@ -101,9 +135,11 @@ class _UserLoginAgreementPageState extends State { child: CustomTextButton( backgroundColor: CustomColors.green, elevation: 0, - onPressed: () { - addUsageAgreement(); - }, + onPressed: isPageLoaded + ? () { + addUsageAgreement(); + } + : null, child: Text(TranslationBase.of(context).acceptLbl.toUpperCase(), style: TextStyle( fontSize: 18.0, @@ -123,14 +159,16 @@ class _UserLoginAgreementPageState extends State { child: CustomTextButton( backgroundColor: Color(0xffc5272d), elevation: 0, - onPressed: () { - Navigator.pushAndRemoveUntil( - context, - FadePage( - page: LandingPage(), - ), - (r) => false); - }, + onPressed: isPageLoaded + ? () { + Navigator.pushAndRemoveUntil( + context, + FadePage( + page: LandingPage(), + ), + (r) => false); + } + : null, child: Text(TranslationBase.of(context).declineLbl.toUpperCase(), style: TextStyle(fontSize: 18.0, color: Colors.white)), ), ), diff --git a/lib/widgets/in_app_browser/InAppBrowser.dart b/lib/widgets/in_app_browser/InAppBrowser.dart index ee68f743..442908a4 100644 --- a/lib/widgets/in_app_browser/InAppBrowser.dart +++ b/lib/widgets/in_app_browser/InAppBrowser.dart @@ -38,9 +38,9 @@ class MyInAppBrowser extends InAppBrowser { static String APPLE_PAY_PAYFORT_URL = 'https://hmgwebservices.com/PayFortWebLive/PayFortApi/MakeApplePayRequest'; // Payfort Payment Gateway URL LIVE // static String APPLE_PAY_PAYFORT_URL = 'https://hmgwebservices.com/PayFortWebLive/PayFortApi/MakeApplePayRequest'; // Payfort Payment Gateway URL UAT - // static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; // Payfort Payment Gateway URL UAT + static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; // Payfort Payment Gateway URL UAT - static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWebLive/pages/SendPayFortRequest.aspx'; //Payfort Payment Gateway URL LIVE + // static String SERVICE_URL = 'https://hmgwebservices.com/PayFortWebL/ive/pages/SendPayFortRequest.aspx'; //Payfort Payment Gateway URL LIVE // static String SERVICE_URL = 'https://uat.hmgwebservices.com/payfortforvidaplus/pages/SendPayFortRequest.aspx'; //Payfort Payment Gateway URL UAT VIDA PLUS