From 33545d1180eaaf000477b7e05acd57c79a802a8f Mon Sep 17 00:00:00 2001 From: mosazaid Date: Thu, 22 Apr 2021 16:32:19 +0300 Subject: [PATCH] work on in paitent referral --- lib/config/localized_values.dart | 1 + .../patient-doctor-referral-service.dart | 25 +- .../viewModel/patient-referral-viewmodel.dart | 50 +- lib/routes.dart | 3 + .../profile/refer_patient_screen.dart | 406 ------------- .../refer-patient-screen-in-patient.dart | 563 ++++++++++++++++++ lib/util/translations_delegate_base.dart | 1 + ...rofile_medical_info_widget_in_patient.dart | 2 +- 8 files changed, 629 insertions(+), 422 deletions(-) delete mode 100644 lib/screens/patients/profile/refer_patient_screen.dart create mode 100644 lib/screens/patients/profile/referral/refer-patient-screen-in-patient.dart diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 59bddc54..fbd53016 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -861,4 +861,5 @@ const Map> localizedValues = { "admission-date": {"en": "Admission Date", "ar": "تاريخ القبول"}, "noOfDays": {"en": "No of days", "ar": "عدد الأيام"}, "numOfDays": {"en": "Number of Days", "ar": "عدد الأيام"}, + "replayBefore": {"en": "Replay Before", "ar": "رد قبل"}, }; diff --git a/lib/core/service/patient-doctor-referral-service.dart b/lib/core/service/patient-doctor-referral-service.dart index 1677bbce..03d549aa 100644 --- a/lib/core/service/patient-doctor-referral-service.dart +++ b/lib/core/service/patient-doctor-referral-service.dart @@ -22,6 +22,8 @@ class PatientReferralService extends LookupService { List patientReferralList = []; String setupID = "0"; + var frequencyList = []; + Future getProjectsList() async { hasError = false; const url = GET_PROJECTS; @@ -191,7 +193,7 @@ class PatientReferralService extends LookupService { Future getPatientReferral(PatiantInformtion patient) async { hasError = false; Map body = Map(); - body['PatientMRN'] = patient.patientMRN; + body['PatientMRN'] = patient.patientMRN ?? patient.patientId; body['AppointmentNo'] = patient.appointmentNo; await baseAppClient.post( @@ -258,7 +260,7 @@ class PatientReferralService extends LookupService { .add({"goalId": element.id, "remarks": element.remarks}); }); - body['PatientMRN'] = patient.patientMRN; + body['PatientMRN'] = patient.patientMRN ?? patient.patientId; body['AppointmentNo'] = patient.appointmentNo; body['SetupID'] = setupID; body['appointmentDate'] = isoStringDate; @@ -284,4 +286,23 @@ class PatientReferralService extends LookupService { body: body, ); } + + Future getReferralFrequencyList() async { + hasError = false; + + Map body = Map(); + + await baseAppClient.post( + PATIENT_GET_LIST_REFERAL_URL, + onSuccess: (dynamic response, int statusCode) { + frequencyList = []; + frequencyList = response['list_STPReferralFrequency']; + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + body: body, + ); + } } diff --git a/lib/core/viewModel/patient-referral-viewmodel.dart b/lib/core/viewModel/patient-referral-viewmodel.dart index 3c3a5b2f..679aa0de 100644 --- a/lib/core/viewModel/patient-referral-viewmodel.dart +++ b/lib/core/viewModel/patient-referral-viewmodel.dart @@ -1,10 +1,8 @@ -import 'package:doctor_app_flutter/config/shared_pref_kay.dart'; import 'package:doctor_app_flutter/core/enum/master_lookup_key.dart'; import 'package:doctor_app_flutter/core/enum/viewstate.dart'; import 'package:doctor_app_flutter/core/service/patient-doctor-referral-service.dart'; import 'package:doctor_app_flutter/core/viewModel/base_view_model.dart'; import 'package:doctor_app_flutter/models/doctor/doctor_profile_model.dart'; -import 'package:doctor_app_flutter/models/patient/PatientArrivalEntity.dart'; import 'package:doctor_app_flutter/models/patient/my_referral/PendingReferral.dart'; import 'package:doctor_app_flutter/models/patient/my_referral/clinic-doctor.dart'; import 'package:doctor_app_flutter/models/patient/my_referral/my_referred_patient_model.dart'; @@ -22,9 +20,13 @@ class PatientReferralViewModel extends BaseViewModel { List get clinicsList => _referralPatientService.clinicsList; + List get referralFrequencyList => + _referralPatientService.frequencyList; + List doctorsList = []; - List get clinicDoctorsList => _referralPatientService.doctorsList; + List get clinicDoctorsList => + _referralPatientService.doctorsList; List get listMyReferredPatientModel => _referralPatientService.listMyReferredPatientModel; @@ -85,20 +87,20 @@ class PatientReferralViewModel extends BaseViewModel { setState(ViewState.Idle); } - Future getClinicDoctors(PatiantInformtion patient ,int clinicId, int branchId) async { + Future getClinicDoctors( + PatiantInformtion patient, int clinicId, int branchId) async { setState(ViewState.BusyLocal); await _referralPatientService.getDoctorsList(patient, clinicId, branchId); if (_referralPatientService.hasError) { error = _referralPatientService.error; setState(ViewState.ErrorLocal); - } else{ + } else { doctorsList.clear(); clinicDoctorsList.forEach((element) { doctorsList.add(element.toJson()); }); setState(ViewState.Idle); } - } Future getDoctorBranch() async { @@ -161,13 +163,25 @@ class PatientReferralViewModel extends BaseViewModel { } } + Future makeInPatientReferral( + {PatiantInformtion patient, + int projectID, + int clinicID, + int doctorID, + int frequencyCode, + int priority, + String referralDate, + String remarks, + String ext}) async { + + } + Future getPatientDetails( String fromDate, String toDate, int patientMrn, int appointmentNo) async { setState(ViewState.Busy); await _referralPatientService.getPatientArrivalList(toDate, - fromDate: fromDate, - patientMrn: patientMrn); + fromDate: fromDate, patientMrn: patientMrn); if (_referralPatientService.hasError) { error = _referralPatientService.error; setState(ViewState.Error); @@ -179,17 +193,27 @@ class PatientReferralViewModel extends BaseViewModel { String getReferralStatusNameByCode(int statusCode, BuildContext context) { switch (statusCode) { case 1: - return TranslationBase.of(context).pending/*referralStatusHold*/; + return TranslationBase.of(context).pending /*referralStatusHold*/; case 2: - return TranslationBase.of(context).accepted/*referralStatusActive*/; + return TranslationBase.of(context).accepted /*referralStatusActive*/; case 4: - return TranslationBase.of(context).rejected/*referralStatusCancelled*/; + return TranslationBase.of(context).rejected /*referralStatusCancelled*/; case 46: - return TranslationBase.of(context).accepted/*referralStatusCompleted*/; + return TranslationBase.of(context).accepted /*referralStatusCompleted*/; case 63: - return TranslationBase.of(context).rejected/*referralStatusNotSeen*/; + return TranslationBase.of(context).rejected /*referralStatusNotSeen*/; default: return "-"; } } + + Future getReferralFrequencyList() async { + setState(ViewState.Busy); + await _referralPatientService.getReferralFrequencyList(); + if (_referralPatientService.hasError) { + error = _referralPatientService.error; + setState(ViewState.Error); + } else + setState(ViewState.Idle); + } } diff --git a/lib/routes.dart b/lib/routes.dart index b18e181d..67a40510 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -8,6 +8,7 @@ import 'package:doctor_app_flutter/screens/patients/profile/lab_result/labs_home import 'package:doctor_app_flutter/screens/patients/profile/progress_note_screen.dart'; import 'package:doctor_app_flutter/screens/patients/profile/radiology/radiology_home_page.dart'; import 'package:doctor_app_flutter/screens/patients/profile/prescriptions/in_patient_prescription_details_screen.dart'; +import 'package:doctor_app_flutter/screens/patients/profile/referral/refer-patient-screen-in-patient.dart'; import 'package:doctor_app_flutter/screens/patients/profile/soap_update/update_soap_index.dart'; import 'package:doctor_app_flutter/screens/prescription/prescriptions_page.dart'; import 'package:doctor_app_flutter/screens/sick-leave/add-sickleave.dart'; @@ -38,6 +39,7 @@ const String MEDICAL_FILE = 'patients/radiology'; const String PROGRESS_NOTE = 'patients/progress-note'; const String MY_REFERRAL_DETAIL = 'my_referral_detail'; const String REFER_PATIENT_TO_DOCTOR = 'patients/refer-to-doctor'; +const String REFER_IN_PATIENT_TO_DOCTOR = 'patients/refer-in-patient-to-doctor'; const String PATIENT_INSURANCE_APPROVALS_NEW = 'patients/patient_insurance_approvals_new'; const String VITAL_SIGN_DETAILS = 'patients/vital-sign-details'; @@ -67,6 +69,7 @@ var routes = { MEDICAL_FILE: (_) => MedicalFilePage(), PROGRESS_NOTE: (_) => ProgressNoteScreen(), REFER_PATIENT_TO_DOCTOR: (_) => PatientMakeReferralScreen(), + REFER_IN_PATIENT_TO_DOCTOR: (_) => PatientMakeInPatientReferralScreen(), PATIENT_INSURANCE_APPROVALS_NEW: (_) => InsuranceApprovalScreenNew(), VITAL_SIGN_DETAILS: (_) => VitalSignDetailsScreen(), RADIOLOGY_PATIENT: (_) => RadiologyHomePage(), diff --git a/lib/screens/patients/profile/refer_patient_screen.dart b/lib/screens/patients/profile/refer_patient_screen.dart deleted file mode 100644 index 354e0e5c..00000000 --- a/lib/screens/patients/profile/refer_patient_screen.dart +++ /dev/null @@ -1,406 +0,0 @@ -import 'package:doctor_app_flutter/config/config.dart'; -import 'package:doctor_app_flutter/core/viewModel/patient_view_model.dart'; -import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart'; -import 'package:doctor_app_flutter/screens/base/base_view.dart'; -import 'package:doctor_app_flutter/util/dr_app_toast_msg.dart'; -import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; -import 'package:doctor_app_flutter/widgets/shared/buttons/app_buttons_widget.dart'; -import 'package:doctor_app_flutter/widgets/shared/dialogs/dailog-list-select.dart'; -import 'package:doctor_app_flutter/widgets/shared/errors/dr_app_embedded_error.dart'; -import 'package:doctor_app_flutter/widgets/shared/rounded_container_widget.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:hexcolor/hexcolor.dart'; -import 'package:intl/intl.dart'; - -import '../../../config/size_config.dart'; -import '../../../util/dr_app_shared_pref.dart'; -import '../../../util/extenstions.dart'; -import '../../../widgets/shared/app_scaffold_widget.dart'; -import '../../../widgets/shared/app_texts_widget.dart'; - -DrAppSharedPreferances sharedPref = new DrAppSharedPreferances(); - -/* - *@author: ibrahim albitar - *@Date:4/6/2020 - *@param: - *@return: - *@desc: - */ - -class ReferPatientScreen extends StatefulWidget { - @override - _ReferPatientState createState() => _ReferPatientState(); -} - -class _ReferPatientState extends State { - dynamic _selectedClinic; - dynamic _selectedDoctor; - final _extController = TextEditingController(); - int _activePriority = 1; - dynamic _selectedFrequency; - final _remarksController = TextEditingController(); - bool isValid; - - @override - Widget build(BuildContext context) { - final screenSize = MediaQuery.of(context).size; - - return BaseView( - onModelReady: (model) => model.getClinicsList(), - builder: (_, model, w) => AppScaffold( - baseViewModel: model, - appBarTitle: TranslationBase.of(context).referralPatient, - body: model.clinicsList == null - ? DrAppEmbeddedError(error: 'Something Wrong!') - : SingleChildScrollView( - child: Container( - margin: EdgeInsets.symmetric(vertical: 16, horizontal: 16), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - height: screenSize.height * 0.070, - child: InkWell( - onTap: model.clinicsList != null && - model.clinicsList.length > 0 - ? () { - ListSelectDialog dialog = ListSelectDialog( - list: model.clinicsList, - attributeName: 'ClinicDescription', - attributeValueId: 'ClinicID', - okText: TranslationBase.of(context).ok, - okFunction: (selectedValue) { - setState(() { - _selectedDoctor = null; - _selectedClinic = selectedValue; - model.getDoctorsList( - _selectedClinic['ClinicID']); - }); - }, - ); - showDialog( - barrierDismissible: false, - context: context, - builder: (BuildContext context) { - return dialog; - }, - ); - } - : null, - child: TextField( - decoration: textFieldSelectorDecoration( - TranslationBase.of(context).clinicSelect, - _selectedClinic != null - ? _selectedClinic['ClinicDescription'] - : null, - true), - enabled: false, - ), - ), - ), - SizedBox( - height: 10, - ), - Container( - height: screenSize.height * 0.070, - child: InkWell( - onTap: model.doctorsList != null && - model.doctorsList.length > 0 - ? () { - ListSelectDialog dialog = ListSelectDialog( - list: model.doctorsList, - attributeName: 'DoctorName', - attributeValueId: 'DoctorID', - okText: TranslationBase.of(context).ok, - okFunction: (selectedValue) { - setState(() { - _selectedDoctor = selectedValue; - }); - }, - ); - showDialog( - barrierDismissible: false, - context: context, - builder: (BuildContext context) { - return dialog; - }, - ); - } - : null, - child: TextField( - decoration: textFieldSelectorDecoration( - TranslationBase.of(context).doctorSelect, - _selectedDoctor != null - ? _selectedDoctor['DoctorName'] - : null, - true), - enabled: false, - ), - ), - ), - SizedBox( - height: 10, - ), - Container( - height: screenSize.height * 0.070, - child: TextField( - decoration: textFieldSelectorDecoration( - TranslationBase.of(context).ext, null, false), - enabled: true, - controller: _extController, - inputFormatters: [ - FilteringTextInputFormatter.allow( - RegExp(ONLY_NUMBERS)) - ], - keyboardType: TextInputType.number, - )), - SizedBox( - height: 10, - ), - priorityBar(context, screenSize), - SizedBox( - height: 20, - ), - AppText( - "${TranslationBase.of(context).referralFrequency} ${getPriority()}", - fontWeight: FontWeight.bold, - fontSize: 16, - ), - SizedBox( - height: 20, - ), - Container( - height: screenSize.height * 0.070, - child: InkWell( - onTap: model.referralFrequencyList != null && - model.referralFrequencyList.length > 0 - ? () { - ListSelectDialog dialog = ListSelectDialog( - list: model.referralFrequencyList, - attributeName: 'Description', - attributeValueId: 'ParameterCode', - okText: TranslationBase.of(context).ok, - okFunction: (selectedValue) { - setState(() { - _selectedFrequency = selectedValue; - }); - }, - ); - showDialog( - barrierDismissible: false, - context: context, - builder: (BuildContext context) { - return dialog; - }, - ); - } - : null, - child: TextField( - decoration: textFieldSelectorDecoration( - TranslationBase.of(context) - .selectReferralFrequency, - _selectedFrequency != null - ? _selectedFrequency['Description'] - : null, - true), - enabled: false, - ), - ), - ), - SizedBox( - height: 10, - ), - Container( - child: TextField( - decoration: textFieldSelectorDecoration( - TranslationBase.of(context).clinicDetailsandRemarks, - null, - false), - enabled: true, - controller: _remarksController, - inputFormatters: [ - FilteringTextInputFormatter.allow( - RegExp(ONLY_LETTERS)) - ], - keyboardType: TextInputType.text, - minLines: 4, - maxLines: 6, - )), - SizedBox( - height: 10, - ), - Container( - child: Column( - children: [ - AppText( - TranslationBase.of(context).pleaseFill, - color: HexColor("#B8382B"), - fontWeight: FontWeight.bold, - margin: 10, - visibility: isValid == null ? false : !isValid, - ), - // TODO replace AppButton with secondary button and add loading - AppButton( - title: TranslationBase.of(context).send, - color: HexColor("#B8382B"), - onPressed: () => {referToDoctor(context, model)}, - ) - ], - ), - ), - ], - ), - ), - ), - ), - ); - } - - Widget priorityBar(BuildContext _context, Size screenSize) { - List _priorities = [ - TranslationBase.of(context).veryUrgent.toUpperCase(), - TranslationBase.of(context).urgent.toUpperCase(), - TranslationBase.of(context).routine.toUpperCase(), - ]; - return Container( - height: screenSize.height * 0.070, - decoration: - containerBorderDecoration(Color(0Xffffffff), Color(0xFFCCCCCC)), - child: Row( - mainAxisSize: MainAxisSize.max, - crossAxisAlignment: CrossAxisAlignment.center, - children: _priorities.map((item) { - bool _isActive = _priorities[_activePriority] == item ? true : false; - return Expanded( - child: InkWell( - child: Center( - child: Container( - height: screenSize.height * 0.070, - decoration: containerBorderDecoration( - _isActive ? HexColor("#B8382B") : Colors.white, - _isActive ? HexColor("#B8382B") : Colors.white), - child: Center( - child: Text( - item, - style: TextStyle( - fontSize: 12, - color: _isActive - ? Colors.white - : Colors.black, //Colors.black, - fontWeight: FontWeight.bold, - ), - ), - )), - ), - onTap: () { - print(_priorities.indexOf(item)); - setState(() { - _activePriority = _priorities.indexOf(item); - }); - }, - ), - ); - }).toList(), - ), - ); - } - - String getPriority() { - DateTime date = DateTime.now(); - switch (_activePriority) { - case 0: - date = date.add(new Duration(hours: 3)); - break; - case 1: - date = date.add(new Duration(hours: 6)); - break; - case 2: - date = date.add(new Duration(days: 1)); - break; - } - var format = DateFormat('yyyy/mm/dd HH:mm a'); - var time = format.format(date); - print(time); - return time; - } - - referToDoctor(BuildContext context, PatientViewModel model) async { - if (!validation()) { - return; - } - - final routeArgs = ModalRoute.of(context).settings.arguments as Map; - PatiantInformtion patient = routeArgs['patient']; - - try { - await model.referToDoctor( - extension: _extController.value.text, - admissionNo: int.parse(patient.admissionNo), - referringDoctorRemarks: _remarksController.value.text, - frequency: _selectedFrequency['ParameterCode'].toString(), - patientID: patient.patientId, - patientTypeID: patient.patientType, - priority: (_activePriority + 1).toString(), - roomID: patient.roomId, - selectedClinicID: _selectedClinic['ClinicID'].toString(), - selectedDoctorID: _selectedDoctor['DoctorID'].toString(), - projectID: patient.projectId); - // TODO: Add Translation - DrAppToastMsg.showSuccesToast('Reply Successfully'); - Navigator.pop(context); - } catch (e) { - DrAppToastMsg.showErrorToast(e); - } - } - - bool validation() { - setState(() { - isValid = !_extController.value.text.isNullOrEmpty() && - !_remarksController.value.text.isNullOrEmpty() && - _selectedClinic != null && - _selectedDoctor != null && - _selectedFrequency != null; - }); - return isValid; - } - - InputDecoration textFieldSelectorDecoration( - String hintText, String selectedText, bool isDropDown) { - return InputDecoration( - focusedBorder: OutlineInputBorder( - borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0), - borderRadius: BorderRadius.circular(8), - ), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0), - borderRadius: BorderRadius.circular(8), - ), - disabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0), - borderRadius: BorderRadius.circular(8), - ), - hintText: selectedText != null ? selectedText : hintText, - suffixIcon: isDropDown ? Icon(Icons.arrow_drop_down) : null, - hintStyle: TextStyle( - fontSize: 14, - color: Colors.grey.shade600, - ), - ); - } - - BoxDecoration containerBorderDecoration( - Color containerColor, Color borderColor) { - return BoxDecoration( - color: containerColor, - shape: BoxShape.rectangle, - borderRadius: BorderRadius.all(Radius.circular(6)), - border: Border.fromBorderSide(BorderSide( - color: borderColor, - width: 2.0, - )), - ); - } -} diff --git a/lib/screens/patients/profile/referral/refer-patient-screen-in-patient.dart b/lib/screens/patients/profile/referral/refer-patient-screen-in-patient.dart new file mode 100644 index 00000000..2ac6d2e0 --- /dev/null +++ b/lib/screens/patients/profile/referral/refer-patient-screen-in-patient.dart @@ -0,0 +1,563 @@ +import 'package:doctor_app_flutter/config/config.dart'; +import 'package:doctor_app_flutter/config/size_config.dart'; +import 'package:doctor_app_flutter/core/enum/viewstate.dart'; +import 'package:doctor_app_flutter/core/viewModel/patient-referral-viewmodel.dart'; +import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart'; +import 'package:doctor_app_flutter/screens/base/base_view.dart'; +import 'package:doctor_app_flutter/util/dr_app_toast_msg.dart'; +import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; +import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart'; +import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; +import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; +import 'package:doctor_app_flutter/widgets/shared/buttons/app_buttons_widget.dart'; +import 'package:doctor_app_flutter/widgets/shared/dialogs/dailog-list-select.dart'; +import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart'; +import 'package:doctor_app_flutter/widgets/shared/text_fields/app-textfield-custom.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:intl/intl.dart'; + +class PatientMakeInPatientReferralScreen extends StatefulWidget { + @override + _PatientMakeInPatientReferralScreenState createState() => + _PatientMakeInPatientReferralScreenState(); +} + +class _PatientMakeInPatientReferralScreenState + extends State { + PatiantInformtion patient; + List referToList; + dynamic _referTo; + dynamic _selectedBranch; + dynamic _selectedClinic; + dynamic _selectedDoctor; + dynamic _selectedFrequency; + final _remarksController = TextEditingController(); + final _extController = TextEditingController(); + int _activePriority = 1; + String appointmentDate; + + String branchError; + String hospitalError; + String clinicError; + String doctorError; + String frequencyError; + + @override + Widget build(BuildContext context) { + final routeArgs = ModalRoute.of(context).settings.arguments as Map; + patient = routeArgs['patient']; + String patientType = routeArgs['patientType']; + String arrivalType = routeArgs['arrivalType']; + + referToList = List(); + dynamic sameBranch = { + "id": 1, + "name": TranslationBase.of(context).sameBranch + }; + dynamic otherBranch = { + "id": 2, + "name": TranslationBase.of(context).otherBranch + }; + referToList.add(sameBranch); + referToList.add(otherBranch); + + final screenSize = MediaQuery.of(context).size; + + return BaseView( + onModelReady: (model) => model.getReferralFrequencyList(), + builder: (_, model, w) => AppScaffold( + baseViewModel: model, + appBarTitle: TranslationBase.of(context).referPatient, + isShowAppBar: true, + appBar: PatientProfileHeaderNewDesignAppBar( + patient, patientType, arrivalType), + body: SingleChildScrollView( + child: Container( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + margin: EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppText( + "${TranslationBase.of(context).refer}", + fontFamily: 'Poppins', + fontSize: SizeConfig.textMultiplier * 1.6, + fontWeight: FontWeight.w600, + ), + AppText( + "${TranslationBase.of(context).patient}", + fontFamily: 'Poppins', + fontSize: SizeConfig.textMultiplier * 3, + fontWeight: FontWeight.bold, + ) + ], + ), + ), + Container( + margin: EdgeInsets.symmetric(vertical: 0, horizontal: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppTextFieldCustom( + height: screenSize.height * 0.075, + hintText: TranslationBase.of(context).branch, + dropDownText: + _referTo != null ? _referTo['name'] : null, + enabled: false, + isTextFieldHasSuffix: true, + validationError: branchError, + onClick: referToList != null + ? () { + ListSelectDialog dialog = ListSelectDialog( + list: referToList, + attributeName: 'name', + attributeValueId: 'id', + okText: TranslationBase.of(context).ok, + okFunction: (selectedValue) { + setState(() { + _referTo = selectedValue; + _selectedBranch = null; + _selectedClinic = null; + _selectedDoctor = null; + model + .getDoctorBranch() + .then((value) async { + _selectedBranch = value; + if (_referTo['id'] == 1) { + GifLoaderDialogUtils.showMyDialog( + context); + await model + .getClinics(_selectedBranch[ + 'facilityId']) + .then((_) => + GifLoaderDialogUtils + .hideDialog(context)); + if (model.state == + ViewState.ErrorLocal) { + DrAppToastMsg.showErrorToast( + model.error); + } + } else { + _selectedBranch = null; + } + }); + }); + }, + ); + showDialog( + barrierDismissible: false, + context: context, + builder: (BuildContext context) { + return dialog; + }, + ); + } + : null, + ), + SizedBox( + height: 10, + ), + AppTextFieldCustom( + height: screenSize.height * 0.075, + hintText: TranslationBase.of(context).hospital, + dropDownText: _selectedBranch != null + ? _selectedBranch['facilityName'] + : null, + enabled: false, + isTextFieldHasSuffix: true, + validationError: hospitalError, + onClick: model.branchesList != null && + model.branchesList.length > 0 && + _referTo != null && + _referTo['id'] == 2 + ? () { + ListSelectDialog dialog = ListSelectDialog( + list: model.branchesList, + attributeName: 'facilityName', + attributeValueId: 'facilityId', + okText: TranslationBase.of(context).ok, + okFunction: (selectedValue) { + setState(() async { + _selectedBranch = selectedValue; + _selectedClinic = null; + _selectedDoctor = null; + GifLoaderDialogUtils.showMyDialog( + context); + await model + .getClinics( + _selectedBranch['facilityId']) + .then((_) => GifLoaderDialogUtils + .hideDialog(context)); + if (model.state == + ViewState.ErrorLocal) { + DrAppToastMsg.showErrorToast( + model.error); + } + }); + }, + ); + showDialog( + barrierDismissible: false, + context: context, + builder: (BuildContext context) { + return dialog; + }, + ); + } + : null, + ), + SizedBox( + height: 10, + ), + AppTextFieldCustom( + height: screenSize.height * 0.075, + hintText: TranslationBase.of(context).clinic, + dropDownText: _selectedClinic != null + ? _selectedClinic['ClinicDescription'] + : null, + enabled: false, + isTextFieldHasSuffix: true, + validationError: clinicError, + onClick: _selectedBranch != null && + model.clinicsList != null && + model.clinicsList.length > 0 + ? () { + ListSelectDialog dialog = ListSelectDialog( + list: model.clinicsList, + attributeName: 'ClinicDescription', + attributeValueId: 'ClinicID', + usingSearch: true, + hintSearchText: + TranslationBase.of(context) + .clinicSearch, + okText: TranslationBase.of(context).ok, + okFunction: (selectedValue) { + setState(() async { + _selectedDoctor = null; + _selectedClinic = selectedValue; + GifLoaderDialogUtils.showMyDialog( + context); + await model + .getClinicDoctors( + patient, + _selectedClinic['ClinicID'], + _selectedBranch['facilityId']) + .then((_) => GifLoaderDialogUtils + .hideDialog(context)); + if (model.state == + ViewState.ErrorLocal) { + DrAppToastMsg.showErrorToast( + model.error); + } + }); + }, + ); + showDialog( + barrierDismissible: false, + context: context, + builder: (BuildContext context) { + return dialog; + }, + ); + } + : null, + ), + SizedBox( + height: 10, + ), + AppTextFieldCustom( + height: screenSize.height * 0.075, + hintText: TranslationBase.of(context).doctor, + dropDownText: _selectedDoctor != null + ? _selectedDoctor['Name'] + : null, + enabled: false, + isTextFieldHasSuffix: true, + validationError: doctorError, + onClick: _selectedClinic != null && + model.doctorsList != null && + model.doctorsList.length > 0 + ? () { + ListSelectDialog dialog = ListSelectDialog( + list: model.doctorsList, + attributeName: 'Name', + attributeValueId: 'DoctorID', + usingSearch: true, + hintSearchText: + TranslationBase.of(context) + .doctorSearch, + okText: TranslationBase.of(context).ok, + okFunction: (selectedValue) { + setState(() { + _selectedDoctor = selectedValue; + }); + }, + ); + showDialog( + barrierDismissible: false, + context: context, + builder: (BuildContext context) { + return dialog; + }, + ); + } + : () { + if (_selectedClinic == null) { + DrAppToastMsg.showErrorToast( + "You need to select a clinic first"); + } else if (model.doctorsList == null || + model.doctorsList.length == 0) { + DrAppToastMsg.showErrorToast( + "There is no doctors for this clinic"); + } + }, + ), + SizedBox( + height: 10, + ), + AppText( + "${TranslationBase.of(context).priority}", + fontFamily: 'Poppins', + fontSize: SizeConfig.textMultiplier * 2.0, + fontWeight: FontWeight.w600, + ), + SizedBox( + height: 4, + ), + priorityBar(context, screenSize), + SizedBox( + height: 10, + ), + AppText( + "${TranslationBase.of(context).replayBefore}: ${getPriority()}", + fontWeight: FontWeight.normal, + fontSize: SizeConfig.textMultiplier * 1.9, + ), + SizedBox( + height: 10, + ), + AppTextFieldCustom( + height: screenSize.height * 0.075, + hintText: + TranslationBase.of(context).referralFrequency, + dropDownText: _selectedFrequency != null + ? _selectedFrequency['Description'] + : null, + enabled: false, + isTextFieldHasSuffix: true, + validationError: frequencyError, + onClick: () { + ListSelectDialog dialog = ListSelectDialog( + list: model.referralFrequencyList, + attributeName: 'Description', + attributeValueId: 'ParameterCode', + usingSearch: true, + hintSearchText: TranslationBase.of(context) + .selectReferralFrequency, + okText: TranslationBase.of(context).ok, + okFunction: (selectedValue) { + setState(() { + _selectedFrequency = selectedValue; + }); + }, + ); + showDialog( + barrierDismissible: false, + context: context, + builder: (BuildContext context) { + return dialog; + }, + ); + }, + ), + SizedBox( + height: 10, + ), + AppTextFieldCustom( + hintText: TranslationBase.of(context).ext, + controller: _extController, + inputType: TextInputType.number, + inputFormatters: [ + FilteringTextInputFormatter.allow( + RegExp(ONLY_NUMBERS)) + ], + ), + SizedBox( + height: 10, + ), + AppTextFieldCustom( + hintText: + TranslationBase.of(context).dietTypeRemarks, + controller: _remarksController, + inputType: TextInputType.multiline, + minLines: 4, + maxLines: 6, + ), + ], + ), + ) + ], + ), + Container( + margin: EdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: AppButton( + title: TranslationBase.of(context).refer, + fontWeight: FontWeight.w700, + color: Color(0XFF359846), + onPressed: () { + setState(() { + if (_referTo == null) { + branchError = + TranslationBase.of(context).fieldRequired; + } else { + branchError = null; + } + if (_selectedBranch == null) { + hospitalError = + TranslationBase.of(context).fieldRequired; + } else { + hospitalError = null; + } + if (_selectedClinic == null) { + clinicError = + TranslationBase.of(context).fieldRequired; + } else { + clinicError = null; + } + if (_selectedDoctor == null) { + doctorError = + TranslationBase.of(context).fieldRequired; + } else { + doctorError = null; + } + if (_selectedFrequency == null) { + frequencyError = + TranslationBase.of(context).fieldRequired; + } else { + frequencyError = null; + } + }); + if (_selectedFrequency == null || + _selectedBranch == null || + _selectedClinic == null || + _selectedDoctor == null || + _remarksController.text == null || + _extController.text == null) return; + model + .makeInPatientReferral( + patient: patient, + projectID: _selectedBranch['facilityId'], + clinicID: _selectedClinic['ClinicID'], + doctorID: _selectedDoctor['DoctorID'], + frequencyCode: _selectedFrequency['ParameterCode'], + ext: _extController.text, + remarks: _remarksController.text, + priority: _activePriority, + referralDate: appointmentDate + ) + .then((_) { + DrAppToastMsg.showSuccesToast( + TranslationBase.of(context).referralSuccessMsg); + Navigator.pop(context); + }); + }, + ), + ) + ], + ), + ), + ), + ), + ); + } + + Widget priorityBar(BuildContext _context, Size screenSize) { + List _priorities = [ + TranslationBase.of(context).veryUrgent.toUpperCase(), + TranslationBase.of(context).urgent.toUpperCase(), + TranslationBase.of(context).routine.toUpperCase(), + ]; + return Container( + height: screenSize.height * 0.070, + decoration: + containerBorderDecoration(Color(0Xffffffff), Color(0xFFCCCCCC)), + child: Row( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.center, + children: _priorities.map((item) { + bool _isActive = _priorities[_activePriority] == item ? true : false; + return Expanded( + child: InkWell( + child: Center( + child: Container( + height: screenSize.height * 0.070, + decoration: containerBorderDecoration( + _isActive ? Color(0XFFB8382B) : Colors.white, + _isActive ? Color(0XFFB8382B) : Colors.white), + child: Center( + child: Text( + item, + style: TextStyle( + fontSize: 12, + color: _isActive + ? Colors.white + : Colors.black, //Colors.black, + fontWeight: FontWeight.bold, + ), + ), + )), + ), + onTap: () { + print(_priorities.indexOf(item)); + setState(() { + _activePriority = _priorities.indexOf(item); + }); + }, + ), + ); + }).toList(), + ), + ); + } + + String getPriority() { + DateTime date = DateTime.now(); + switch (_activePriority) { + case 0: + date = date.add(new Duration(hours: 3)); + break; + case 1: + date = date.add(new Duration(hours: 6)); + break; + case 2: + date = date.add(new Duration(days: 1)); + break; + } + var format = DateFormat('yyyy/mm/dd HH:mm a'); + var time = format.format(date); + print(time); + + appointmentDate = time; + return time; + } + + BoxDecoration containerBorderDecoration( + Color containerColor, Color borderColor) { + return BoxDecoration( + color: containerColor, + shape: BoxShape.rectangle, + borderRadius: BorderRadius.all(Radius.circular(6)), + border: Border.fromBorderSide(BorderSide( + color: borderColor, + width: 2.0, + )), + ); + } +} diff --git a/lib/util/translations_delegate_base.dart b/lib/util/translations_delegate_base.dart index 51cca1cc..f40ce841 100644 --- a/lib/util/translations_delegate_base.dart +++ b/lib/util/translations_delegate_base.dart @@ -1236,6 +1236,7 @@ class TranslationBase { localizedValues['admission-date'][locale.languageCode]; String get noOfDays => localizedValues['noOfDays'][locale.languageCode]; String get numOfDays => localizedValues['numOfDays'][locale.languageCode]; + String get replayBefore => localizedValues['replayBefore'][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/lib/widgets/patients/profile/profile_medical_info_widget_in_patient.dart b/lib/widgets/patients/profile/profile_medical_info_widget_in_patient.dart index 7e760b1f..fa7d8975 100644 --- a/lib/widgets/patients/profile/profile_medical_info_widget_in_patient.dart +++ b/lib/widgets/patients/profile/profile_medical_info_widget_in_patient.dart @@ -135,7 +135,7 @@ class ProfileMedicalInfoWidgetInPatient extends StatelessWidget { patient: patient, patientType: patientType, arrivalType: arrivalType, - route: REFER_PATIENT_TO_DOCTOR, + route: REFER_IN_PATIENT_TO_DOCTOR, nameLine1: TranslationBase.of(context).referral, nameLine2: TranslationBase.of(context).patient, icon: 'patient/refer_patient.png'),