From 2b3a7f33d18a261e875e80dc66d5b3d3a408efdc Mon Sep 17 00:00:00 2001 From: mosazaid Date: Sun, 7 Feb 2021 09:24:48 +0200 Subject: [PATCH] working on some bug fixes and finish addmission request --- lib/config/config.dart | 4 + lib/config/localized_values.dart | 11 +- lib/core/enum/master_lookup_key.dart | 4 + .../admissionRequest/admission-request.dart | 200 +++++++ .../model/admissionRequest/clinic-model.dart | 33 ++ lib/core/service/base/lookup-service.dart | 8 + .../patient-admission-request-service.dart | 99 +++- .../patient-doctor-referral-service.dart | 7 +- lib/core/service/patient-ucaf-service.dart | 21 + .../patient-admission-request-viewmodel.dart | 70 ++- .../viewModel/patient-ucaf-viewmodel.dart | 22 + lib/routes.dart | 3 +- .../profile/UCAF/UCAF-detail-screen.dart | 81 ++- .../profile/UCAF/UCAF-input-screen.dart | 2 +- .../admission-request-detail-screen.dart | 8 +- .../admission-request-third-screen.dart | 519 +++++++++++++----- .../admission-request_second-screen.dart | 287 ++++++++-- .../referral/my-referral-patient-screen.dart | 2 + .../referral/refer-patient-screen.dart | 61 +- lib/util/translations_delegate_base.dart | 9 + .../patient-referral-item-widget.dart | 23 + 21 files changed, 1183 insertions(+), 291 deletions(-) create mode 100644 lib/core/model/admissionRequest/admission-request.dart create mode 100644 lib/core/model/admissionRequest/clinic-model.dart diff --git a/lib/config/config.dart b/lib/config/config.dart index abd07c03..765874b4 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -25,6 +25,7 @@ const PATIENT_GET_LIST_REFERAL_URL = const PATIENT_GET_CLINIC_BY_PROJECT_URL = "Services/DoctorApplication.svc/REST/GetClinicsByProjectID"; const PROJECT_GET_INFO = "Services/DoctorApplication.svc/REST/GetProjectInfo"; +const GET_CLINICS = "Services/DoctorApplication.svc/REST/GetClinics"; //const GET_PROJECTS = 'Services/Lists.svc/REST/GetProjectForDoctorAPP'; const GET_PROJECTS = 'Services/DoctorApplication.svc/REST/GetProjectInfo'; @@ -193,6 +194,9 @@ const DRUG_TO_DRUG = const GET_MEDICAL_FILE = 'Services/DoctorApplication.svc/REST/GetMedicalFile'; const GET_WARDS = 'Services/DoctorApplication.svc/REST/GetWards'; const GET_DIAGNOSIS_TYPES = 'Services/DoctorApplication.svc/REST/DiagnosisTypes'; +const GET_DIET_TYPES = 'Services/DoctorApplication.svc/REST/DietTypes'; +const GET_ICD_CODES = 'Services/DoctorApplication.svc/REST/GetICDCodes'; +const POST_ADMISSION_REQUEST = 'Services/DoctorApplication.svc/REST/PostAdmissionRequest'; var selectedPatientType = 1; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index d06b6f75..1ec01512 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -425,7 +425,8 @@ const Map> localizedValues = { 'en': "Expected Admission Date", 'ar': 'تاريخ القبول المتوقع' }, - 'emergencyAdmission': {'en': "EMERGENCY ADMISSION", 'ar': 'دخول الطوارئ'}, + // 'emergencyAdmission': {'en': "EMERGENCY ADMISSION", 'ar': 'دخول الطوارئ'}, + 'isSickLeaveRequired': {'en': "Is Sick Leave Required", 'ar': 'هل الإجازة المرضية مطلوبة'}, 'patientPregnant': {'en': "Patient Pregnant", 'ar': 'حمل المريض'}, 'treatmentLine': { 'en': "Main line of treatment", @@ -458,6 +459,10 @@ const Map> localizedValues = { 'en': "POST PLANS & ESTIMATED COST", 'ar': 'خطط البريد والتكلفة المقدرة' }, + 'postPlans': { + 'en': "POST PLANS", + 'ar': 'خطط البريد' + }, 'ucaf': {'en': "UCAF", 'ar': 'UCAF'}, 'emergencyCase': {'en': "Emergency Case", 'ar': 'حالة طارئة'}, 'durationOfIllness': {'en': "duration Of Illness", 'ar': 'مدة المرض'}, @@ -530,6 +535,7 @@ const Map> localizedValues = { 'condition': {'en': "Condition", 'ar': "الحالة"}, 'id': {'en': "ID", 'ar': "بطاقة هوية"}, 'quantity': {'en': "Quantity", 'ar': "الكمية"}, + 'durDays': {'en': "Dur.(days)", 'ar': "الفترة(أيام)"}, 'codeNo': {'en': "Code #", 'ar': "# الرمز"}, 'covered': {'en': "Covered", 'ar': "مغطى"}, 'approvalRequired': {'en': "Approval Required", 'ar': "الموافقة مطلوبة"}, @@ -698,6 +704,9 @@ const Map> localizedValues = { 'clinicSearch': {'en': "Search Clinic", 'ar': "بحث عن عيادة"}, 'doctorSearch': {'en': "Search Doctor", 'ar': "بحث عن طبيب"}, + 'referralResponse': {'en': "Referral Response : ", 'ar': " : استجابة الإحالة"}, + 'estimatedCost': {'en': "Estimated Cost", 'ar': "التكلفة المتوقعة"}, + 'diagnosisDetail': {'en': "Diagnosis Detail : ", 'ar': "تفاصيل التشخيص"}, // 'icd': {'en': "ICD", 'ar': " "}, }; diff --git a/lib/core/enum/master_lookup_key.dart b/lib/core/enum/master_lookup_key.dart index e0c8ccc3..f42fa181 100644 --- a/lib/core/enum/master_lookup_key.dart +++ b/lib/core/enum/master_lookup_key.dart @@ -14,6 +14,7 @@ enum MasterKeysService { TemperatureMethods, Speciality, AdmissionRequestType, + DiagnosisSelectionType, } extension SelectedMasterKeysService on MasterKeysService { @@ -61,6 +62,9 @@ extension SelectedMasterKeysService on MasterKeysService { case MasterKeysService.AdmissionRequestType: return 2019; break; + case MasterKeysService.DiagnosisSelectionType: + return 2024; + break; } } } diff --git a/lib/core/model/admissionRequest/admission-request.dart b/lib/core/model/admissionRequest/admission-request.dart new file mode 100644 index 00000000..1ab5a990 --- /dev/null +++ b/lib/core/model/admissionRequest/admission-request.dart @@ -0,0 +1,200 @@ +class AdmissionRequest { + int patientMRN; + int admitToClinic; + bool isPregnant; + int pregnancyWeeks; + int pregnancyType; + int noOfBabies; + int mrpDoctorID; + String admissionDate; + int expectedDays; + int admissionType; + int admissionLocationID; + int roomCategoryID; + int wardID; + bool isSickLeaveRequired; + String sickLeaveComments; + bool isTransport; + String transportComments; + bool isPhysioAppointmentNeeded; + String physioAppointmentComments; + bool isOPDFollowupAppointmentNeeded; + String opdFollowUpComments; + bool isDietType; + int dietType; + String dietRemarks; + bool isPhysicalActivityModification; + String physicalActivityModificationComments; + int orStatus; + String mainLineOfTreatment; + int estimatedCost; + String elementsForImprovement; + bool isPackagePatient; + String complications; + String otherDepartmentInterventions; + String otherProcedures; + String pastMedicalHistory; + String pastSurgicalHistory; + List admissionRequestDiagnoses; + List admissionRequestProcedures; + int appointmentNo; + int episodeID; + int admissionRequestNo; + + AdmissionRequest( + {this.patientMRN, + this.admitToClinic, + this.isPregnant, + this.pregnancyWeeks = 0, + this.pregnancyType = 0, + this.noOfBabies = 0, + this.mrpDoctorID, + this.admissionDate, + this.expectedDays, + this.admissionType, + this.admissionLocationID = 0, + this.roomCategoryID = 0, + this.wardID, + this.isSickLeaveRequired, + this.sickLeaveComments = "", + this.isTransport = false, + this.transportComments = "", + this.isPhysioAppointmentNeeded = false, + this.physioAppointmentComments = "", + this.isOPDFollowupAppointmentNeeded = false, + this.opdFollowUpComments = "", + this.isDietType, + this.dietType, + this.dietRemarks, + this.isPhysicalActivityModification = false, + this.physicalActivityModificationComments = "", + this.orStatus = 1, + this.mainLineOfTreatment, + this.estimatedCost, + this.elementsForImprovement, + this.isPackagePatient = false, + this.complications = "", + this.otherDepartmentInterventions = "", + this.otherProcedures = "", + this.pastMedicalHistory = "", + this.pastSurgicalHistory = "", + this.admissionRequestDiagnoses, + this.admissionRequestProcedures, + this.appointmentNo, + this.episodeID, + this.admissionRequestNo}); + + AdmissionRequest.fromJson(Map json) { + patientMRN = json['patientMRN']; + admitToClinic = json['admitToClinic']; + isPregnant = json['isPregnant']; + pregnancyWeeks = json['pregnancyWeeks']; + pregnancyType = json['pregnancyType']; + noOfBabies = json['noOfBabies']; + mrpDoctorID = json['mrpDoctorID']; + admissionDate = json['admissionDate']; + expectedDays = json['expectedDays']; + admissionType = json['admissionType']; + admissionLocationID = json['admissionLocationID']; + roomCategoryID = json['roomCategoryID']; + wardID = json['wardID']; + isSickLeaveRequired = json['isSickLeaveRequired']; + sickLeaveComments = json['sickLeaveComments']; + isTransport = json['isTransport']; + transportComments = json['transportComments']; + isPhysioAppointmentNeeded = json['isPhysioAppointmentNeeded']; + physioAppointmentComments = json['physioAppointmentComments']; + isOPDFollowupAppointmentNeeded = json['isOPDFollowupAppointmentNeeded']; + opdFollowUpComments = json['opdFollowUpComments']; + isDietType = json['isDietType']; + dietType = json['dietType']; + dietRemarks = json['dietRemarks']; + isPhysicalActivityModification = json['isPhysicalActivityModification']; + physicalActivityModificationComments = + json['physicalActivityModificationComments']; + orStatus = json['orStatus']; + mainLineOfTreatment = json['mainLineOfTreatment']; + estimatedCost = json['estimatedCost']; + elementsForImprovement = json['elementsForImprovement']; + isPackagePatient = json['isPackagePatient']; + complications = json['complications']; + otherDepartmentInterventions = json['otherDepartmentInterventions']; + otherProcedures = json['otherProcedures']; + pastMedicalHistory = json['pastMedicalHistory']; + pastSurgicalHistory = json['pastSurgicalHistory']; + if (json['admissionRequestDiagnoses'] != null) { + admissionRequestDiagnoses = new List(); + json['admissionRequestDiagnoses'].forEach((v) { + admissionRequestDiagnoses.add(v); + // admissionRequestDiagnoses + // .add(new AdmissionRequestDiagnoses.fromJson(v)); + }); + } + if (json['admissionRequestProcedures'] != null) { + admissionRequestProcedures = new List(); + json['admissionRequestProcedures'].forEach((v) { + admissionRequestProcedures.add(v); + // admissionRequestProcedures + // .add(new AdmissionRequestProcedures.fromJson(v)); + }); + } + appointmentNo = json['appointmentNo']; + episodeID = json['episodeID']; + admissionRequestNo = json['admissionRequestNo']; + } + + Map toJson() { + final Map data = new Map(); + data['patientMRN'] = this.patientMRN; + data['admitToClinic'] = this.admitToClinic; + data['isPregnant'] = this.isPregnant; + data['pregnancyWeeks'] = this.pregnancyWeeks; + data['pregnancyType'] = this.pregnancyType; + data['noOfBabies'] = this.noOfBabies; + data['mrpDoctorID'] = this.mrpDoctorID; + data['admissionDate'] = this.admissionDate; + data['expectedDays'] = this.expectedDays; + data['admissionType'] = this.admissionType; + data['admissionLocationID'] = this.admissionLocationID; + data['roomCategoryID'] = this.roomCategoryID; + data['wardID'] = this.wardID; + data['isSickLeaveRequired'] = this.isSickLeaveRequired; + data['sickLeaveComments'] = this.sickLeaveComments; + data['isTransport'] = this.isTransport; + data['transportComments'] = this.transportComments; + data['isPhysioAppointmentNeeded'] = this.isPhysioAppointmentNeeded; + data['physioAppointmentComments'] = this.physioAppointmentComments; + data['isOPDFollowupAppointmentNeeded'] = + this.isOPDFollowupAppointmentNeeded; + data['opdFollowUpComments'] = this.opdFollowUpComments; + data['isDietType'] = this.isDietType; + data['dietType'] = this.dietType; + data['dietRemarks'] = this.dietRemarks; + data['isPhysicalActivityModification'] = + this.isPhysicalActivityModification; + data['physicalActivityModificationComments'] = + this.physicalActivityModificationComments; + data['orStatus'] = this.orStatus; + data['mainLineOfTreatment'] = this.mainLineOfTreatment; + data['estimatedCost'] = this.estimatedCost; + data['elementsForImprovement'] = this.elementsForImprovement; + data['isPackagePatient'] = this.isPackagePatient; + data['complications'] = this.complications; + data['otherDepartmentInterventions'] = this.otherDepartmentInterventions; + data['otherProcedures'] = this.otherProcedures; + data['pastMedicalHistory'] = this.pastMedicalHistory; + data['pastSurgicalHistory'] = this.pastSurgicalHistory; + if (this.admissionRequestDiagnoses != null) { + data['admissionRequestDiagnoses'] = this.admissionRequestDiagnoses; + // this.admissionRequestDiagnoses.map((v) => v.toJson()).toList(); + } + if (this.admissionRequestProcedures != null) { + data['admissionRequestProcedures'] = + this.admissionRequestProcedures.map((v) => v.toJson()).toList(); + } + data['appointmentNo'] = this.appointmentNo; + data['episodeID'] = this.episodeID; + data['admissionRequestNo'] = this.admissionRequestNo; + return data; + } +} diff --git a/lib/core/model/admissionRequest/clinic-model.dart b/lib/core/model/admissionRequest/clinic-model.dart new file mode 100644 index 00000000..05d34645 --- /dev/null +++ b/lib/core/model/admissionRequest/clinic-model.dart @@ -0,0 +1,33 @@ +class Clinic { + int clinicGroupID; + String clinicGroupName; + int clinicID; + String clinicNameArabic; + String clinicNameEnglish; + + Clinic( + {this.clinicGroupID, + this.clinicGroupName, + this.clinicID, + this.clinicNameArabic, + this.clinicNameEnglish}); + + Clinic.fromJson(Map json) { + clinicGroupID = json['clinicGroupID']; + clinicGroupName = json['clinicGroupName']; + clinicID = json['clinicID']; + clinicNameArabic = json['clinicNameArabic']; + clinicNameEnglish = json['clinicNameEnglish']; + } + + Map toJson() { + final Map data = new Map(); + data['clinicGroupID'] = this.clinicGroupID; + data['clinicGroupName'] = this.clinicGroupName; + data['clinicID'] = this.clinicID; + data['clinicNameArabic'] = this.clinicNameArabic; + data['clinicNameEnglish'] = this.clinicNameEnglish; + return data; + } + +} \ No newline at end of file diff --git a/lib/core/service/base/lookup-service.dart b/lib/core/service/base/lookup-service.dart index 48a78ae7..b662b62c 100644 --- a/lib/core/service/base/lookup-service.dart +++ b/lib/core/service/base/lookup-service.dart @@ -38,6 +38,7 @@ class LookupService extends BaseService { List listOfTemperatureMethods = []; List listOfSpeciality = []; List listOfAdmissionType = []; + List listOfDiagnosisSelectionTypes = []; Future getMasterLookup(MasterKeysService masterKeys) async { hasError = false; @@ -153,6 +154,13 @@ class LookupService extends BaseService { listOfAdmissionType.add(v); }); break; + case MasterKeysService.DiagnosisSelectionType: + listOfDiagnosisSelectionTypes.clear(); + entryList.forEach((v) { + // listOfAdmissionType.add(MasterKeyModel.fromJson(v)); + listOfDiagnosisSelectionTypes.add(v); + }); + break; } } diff --git a/lib/core/service/patient-admission-request-service.dart b/lib/core/service/patient-admission-request-service.dart index dca7b60d..c287c160 100644 --- a/lib/core/service/patient-admission-request-service.dart +++ b/lib/core/service/patient-admission-request-service.dart @@ -1,14 +1,18 @@ import 'package:doctor_app_flutter/config/config.dart'; +import 'package:doctor_app_flutter/core/model/admissionRequest/admission-request.dart'; import 'package:doctor_app_flutter/core/model/admissionRequest/ward-model.dart'; import 'package:doctor_app_flutter/core/service/base/lookup-service.dart'; import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart'; class AdmissionRequestService extends LookupService { + List clinicList = []; List doctorsList = []; List specialityList = []; List wardList = []; List diagnosisTypesList = []; List allergiesLookupList = []; + List dietTypesList = []; + List icdCodes = []; setSpecialityList() { specialityList.clear(); @@ -24,9 +28,12 @@ class AdmissionRequestService extends LookupService { }); } - Future getDoctorsList() async { + Future getDoctorsList(int clinicId) async { hasError = false; + Map body = Map(); + body['ClinicID'] = clinicId; + await baseAppClient.post( PATIENT_GET_DOCTOR_BY_CLINIC_URL, onSuccess: (dynamic response, int statusCode) { @@ -37,6 +44,26 @@ class AdmissionRequestService extends LookupService { hasError = true; super.error = error; }, + body: body, + ); + } + + Future getClinics() async { + hasError = false; + + await baseAppClient.post( + GET_CLINICS, + onSuccess: (dynamic response, int statusCode) { + clinicList.clear(); + if (response['listClinics'] != null && + response['listClinics']['entityList'] != null) { + clinicList.addAll(response['listClinics']['entityList']); + } + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: Map(), ); } @@ -86,4 +113,74 @@ class AdmissionRequestService extends LookupService { body: Map(), ); } + + Future getDietTypesList() async { + hasError = false; + + await baseAppClient.post( + GET_DIET_TYPES, + onSuccess: (dynamic response, int statusCode) { + dietTypesList.clear(); + if (response['DietTypeList'] != null && + response['DietTypeList']['entityList'] != null) { + response['DietTypeList']['entityList'].forEach((v) { + // diagnosisTypesList.add(MasterKeyModel.fromJson(v)); + dietTypesList.add(v); + }); + } + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + body: Map(), + ); + } + + Future getICDCodes(int patientMrn) async { + hasError = false; + + Map body = Map(); + body['PatientMRN'] = patientMrn; + body['isPatientDiagnosisOnly'] = true; + + await baseAppClient.post( + GET_ICD_CODES, + onSuccess: (dynamic response, int statusCode) { + icdCodes.clear(); + if (response['ICDCodesList'] != null) { + icdCodes.addAll(response['ICDCodesList']); + // response['ICDCodesList'].forEach((v) { + // diagnosisTypesList.add(MasterKeyModel.fromJson(v)); + // icdCodes.add(v); + // }); + } + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + body: body, + ); + } + + Future makeAdmissionRequest(AdmissionRequest admissionRequest) async{ + hasError = false; + + Map body = Map(); + body['AdmissionRequestViewModel'] = admissionRequest.toJson(); + + await baseAppClient.post( + POST_ADMISSION_REQUEST, + onSuccess: (dynamic response, int statusCode) { + print(response); + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + body: body, + ); + } + } diff --git a/lib/core/service/patient-doctor-referral-service.dart b/lib/core/service/patient-doctor-referral-service.dart index f452cfb6..69f8e5e5 100644 --- a/lib/core/service/patient-doctor-referral-service.dart +++ b/lib/core/service/patient-doctor-referral-service.dart @@ -197,12 +197,13 @@ class PatientReferralService extends LookupService { DoctorProfileModel doctorProfile = await getDoctorProfile(); Map body = Map(); - body['IsAccepted'] = isAccepted; - body['AppointmentNo'] = pendingReferral.sourceAppointmentNo; body['PatientMRN'] = pendingReferral.patientID; + body['AppointmentNo'] = pendingReferral.sourceAppointmentNo; + body['SetupID'] = pendingReferral.sourceSetupID; + body['ProjectID'] = pendingReferral.sourceProjectId; + body['IsAccepted'] = isAccepted; body['PatientName'] = pendingReferral.patientName; body['ReferralResponse'] = pendingReferral.remarksFromSource; - body['SetupID'] = pendingReferral.sourceSetupID; body['DoctorName'] = doctorProfile.doctorName; await baseAppClient.post( diff --git a/lib/core/service/patient-ucaf-service.dart b/lib/core/service/patient-ucaf-service.dart index e7ecc9f2..429e78a9 100644 --- a/lib/core/service/patient-ucaf-service.dart +++ b/lib/core/service/patient-ucaf-service.dart @@ -1,4 +1,5 @@ import 'package:doctor_app_flutter/config/config.dart'; +import 'package:doctor_app_flutter/core/model/prescription_model.dart'; import 'package:doctor_app_flutter/core/service/base/base_service.dart'; import 'package:doctor_app_flutter/core/service/base/lookup-service.dart'; import 'package:doctor_app_flutter/models/SOAP/ChiefComplaint/GetChiefComplaintReqModel.dart'; @@ -14,6 +15,7 @@ class UcafService extends LookupService { VitalSignData patientVitalSigns; List patientAssessmentList = []; List orderProcedureList = []; + PrescriptionModel prescriptionList; Future getPatientChiefComplaint(PatiantInformtion patient) async { hasError = false; @@ -81,6 +83,25 @@ class UcafService extends LookupService { }, body: body); } + Future getPrescription(PatiantInformtion patient) async { + hasError = false; + + Map body = Map(); + body['PatientMRN'] = patient.patientMRN; + body['AppointmentNo'] = patient.appointmentNo; + body['EpisodeID'] = patient.episodeNo; + + hasError = false; + prescriptionList = null; + await baseAppClient.post(GET_PRESCRIPTION_LIST, + onSuccess: (dynamic response, int statusCode) { + prescriptionList = PrescriptionModel.fromJson(response['PrescriptionList']); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } + Future getOrderProcedures(PatiantInformtion patient) async { hasError = false; Map body = Map(); diff --git a/lib/core/viewModel/patient-admission-request-viewmodel.dart b/lib/core/viewModel/patient-admission-request-viewmodel.dart index d427eb67..5b079512 100644 --- a/lib/core/viewModel/patient-admission-request-viewmodel.dart +++ b/lib/core/viewModel/patient-admission-request-viewmodel.dart @@ -1,6 +1,7 @@ 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/model/admissionRequest/admission-request.dart'; import 'package:doctor_app_flutter/core/model/admissionRequest/ward-model.dart'; import 'package:doctor_app_flutter/core/service/patient-admission-request-service.dart'; import 'package:doctor_app_flutter/core/viewModel/base_view_model.dart'; @@ -12,6 +13,8 @@ class AdmissionRequestViewModel extends BaseViewModel{ AdmissionRequestService _admissionRequestService = locator(); + List get clinicList => _admissionRequestService.clinicList; + List get doctorsList => _admissionRequestService.doctorsList; List get speciality => _admissionRequestService.specialityList; @@ -24,33 +27,44 @@ class AdmissionRequestViewModel extends BaseViewModel{ List get allergiesList => _admissionRequestService.allergiesLookupList; - String selectedLanguage; + List get dietTypesList => _admissionRequestService.dietTypesList; - Future getLanguage() async { - selectedLanguage = await sharedPref.getString(APP_Language); - } + List get icdCodes => _admissionRequestService.icdCodes; + + List get listOfDiagnosisSelectionTypes => _admissionRequestService.listOfDiagnosisSelectionTypes; + + AdmissionRequest admissionRequestData; Future getSpecialityList() async { - await getLanguage(); await getMasterLookup(MasterKeysService.Speciality); if (!_admissionRequestService.hasError) { _admissionRequestService.setSpecialityList(); - await getClinicDoctors(); + await getClinicDoctors(1); } } - Future getClinicDoctors() async { - setState(ViewState.Busy); - await _admissionRequestService.getDoctorsList(); + Future getClinics() async { + setState(ViewState.BusyLocal); + await _admissionRequestService.getClinics(); if (_admissionRequestService.hasError) { error = _admissionRequestService.error; - setState(ViewState.Error); + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } + + Future getClinicDoctors(int clinicId) async { + setState(ViewState.BusyLocal); + await _admissionRequestService.getDoctorsList(clinicId); + if (_admissionRequestService.hasError) { + error = _admissionRequestService.error; + setState(ViewState.ErrorLocal); } else setState(ViewState.Idle); } Future getWards() async { - setState(ViewState.Busy); + setState(ViewState.BusyLocal); await _admissionRequestService.getWardList(); if (_admissionRequestService.hasError) { error = _admissionRequestService.error; @@ -60,7 +74,7 @@ class AdmissionRequestViewModel extends BaseViewModel{ } Future getDiagnosis() async { - setState(ViewState.Busy); + setState(ViewState.BusyLocal); await _admissionRequestService.getDiagnosisTypesList(); if (_admissionRequestService.hasError) { error = _admissionRequestService.error; @@ -76,8 +90,38 @@ class AdmissionRequestViewModel extends BaseViewModel{ } } - Future getMasterLookup(MasterKeysService keysService) async { + Future getDietTypes() async { + setState(ViewState.BusyLocal); + await _admissionRequestService.getDietTypesList(); + if (_admissionRequestService.hasError) { + error = _admissionRequestService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } + + Future getICDCodes(int patientMrn) async { + setState(ViewState.BusyLocal); + await _admissionRequestService.getICDCodes(patientMrn); + if (_admissionRequestService.hasError) { + error = _admissionRequestService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } + + Future makeAdmissionRequest() async{ setState(ViewState.Busy); + await _admissionRequestService.makeAdmissionRequest(admissionRequestData); + if (_admissionRequestService.hasError) { + error = _admissionRequestService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } + + Future getMasterLookup(MasterKeysService keysService) async { + setState(ViewState.BusyLocal); await _admissionRequestService.getMasterLookup(keysService); if (_admissionRequestService.hasError) { error = _admissionRequestService.error; diff --git a/lib/core/viewModel/patient-ucaf-viewmodel.dart b/lib/core/viewModel/patient-ucaf-viewmodel.dart index ae8fc96f..f48ef485 100644 --- a/lib/core/viewModel/patient-ucaf-viewmodel.dart +++ b/lib/core/viewModel/patient-ucaf-viewmodel.dart @@ -1,6 +1,7 @@ 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/model/prescription_model.dart'; import 'package:doctor_app_flutter/core/service/patient-ucaf-service.dart'; import 'package:doctor_app_flutter/core/viewModel/base_view_model.dart'; import 'package:doctor_app_flutter/models/SOAP/ChiefComplaint/GetChiefComplaintResModel.dart'; @@ -29,10 +30,18 @@ class UcafViewModel extends BaseViewModel { List get diagnosisConditions => _ucafService.listOfDiagnosisCondition; + PrescriptionModel get prescriptionList => _ucafService.prescriptionList; + List get orderProcedures => _ucafService.orderProcedureList; String selectedLanguage; + resetDataInFirst(){ + _ucafService.patientAssessmentList = []; + _ucafService.orderProcedureList = []; + _ucafService.prescriptionList = null; + } + Future getLanguage() async { selectedLanguage = await sharedPref.getString(APP_Language); } @@ -90,6 +99,19 @@ class UcafViewModel extends BaseViewModel { } } + Future getPrescription(PatiantInformtion patient) async { + if (prescriptionList == null) { + setState(ViewState.Busy); + await _ucafService.getPrescription(patient); + if (_ucafService.hasError) { + error = _ucafService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + } + MasterKeyModel findMasterDataById( {@required MasterKeysService masterKeys, dynamic id}) { switch (masterKeys) { diff --git a/lib/routes.dart b/lib/routes.dart index 8f2b08a4..6c5fc954 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -137,9 +137,10 @@ var routes = { PATIENT_INSURANCE_APPROVALS: (_) => InsuranceApprovalsScreen(), VITAL_SIGN_DETAILS: (_) => VitalSignDetailsScreen(), PATIENT_VITAL_SIGN: (_) => PatientVitalSignScreen(), - PATIENT_ADMISSION_REQUEST: (_) => AdmissionRequestDetailScreen(), + PATIENT_ADMISSION_REQUEST: (_) => AdmissionRequestThirdScreen(), PATIENT_ADMISSION_REQUEST_2: (_) => AdmissionRequestSecondScreen(), PATIENT_ADMISSION_REQUEST_3: (_) => AdmissionRequestThirdScreen(), + // PATIENT_ADMISSION_REQUEST: (_) => AdmissionRequestDetailScreen(), CREATE_EPISODE: (_) => UpdateSoapIndex(isUpdate: true,), UPDATE_EPISODE: (_) => UpdateSoapIndex( isUpdate: true, diff --git a/lib/screens/patients/profile/UCAF/UCAF-detail-screen.dart b/lib/screens/patients/profile/UCAF/UCAF-detail-screen.dart index 71955b0c..f4b26f6a 100644 --- a/lib/screens/patients/profile/UCAF/UCAF-detail-screen.dart +++ b/lib/screens/patients/profile/UCAF/UCAF-detail-screen.dart @@ -1,6 +1,7 @@ import 'package:doctor_app_flutter/config/size_config.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/model/prescription_model.dart'; import 'package:doctor_app_flutter/core/viewModel/patient-ucaf-viewmodel.dart'; import 'package:doctor_app_flutter/models/SOAP/GetAssessmentResModel.dart'; import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart'; @@ -35,6 +36,7 @@ class _UcafDetailScreenState extends State { return BaseView( onModelReady: (model) async { + model.resetDataInFirst(); await model.getLanguage(); await model.getPatientAssessment(patient); }, @@ -54,8 +56,8 @@ class _UcafDetailScreenState extends State { height: 10, ), Container( - margin: - EdgeInsets.symmetric(vertical: 16, horizontal: 16), + margin: EdgeInsets.symmetric( + vertical: 16, horizontal: 16), child: Column( children: [ treatmentStepsBar( @@ -63,7 +65,8 @@ class _UcafDetailScreenState extends State { SizedBox( height: 16, ), - ...getSelectedTreatmentStepItem(context, model), + ...getSelectedTreatmentStepItem( + context, model), ], ), ), @@ -73,8 +76,7 @@ class _UcafDetailScreenState extends State { ), ), Container( - margin: - EdgeInsets.symmetric(vertical: 8, horizontal: 16), + margin: EdgeInsets.symmetric(vertical: 8, horizontal: 16), child: BorderedButton( TranslationBase.of(context).save, hasBorder: true, @@ -85,21 +87,22 @@ class _UcafDetailScreenState extends State { textColor: Colors.white, fontSize: SizeConfig.textMultiplier * 2.0, handler: () async { - await model.postUCAF(patient); - if(model.state == ViewState.Idle){ - DrAppToastMsg.showSuccesToast(TranslationBase.of(context).postUcafSuccessMsg); - Navigator.of(context).popUntil((route){ - return route.settings.name == PATIENTS_PROFILE; - }); - } else { - DrAppToastMsg.showErrorToast(model.error); - } + await model.postUCAF(patient); + if (model.state == ViewState.Idle) { + DrAppToastMsg.showSuccesToast( + TranslationBase.of(context).postUcafSuccessMsg); + Navigator.of(context).popUntil((route) { + return route.settings.name == PATIENTS_PROFILE; + }); + } else { + DrAppToastMsg.showErrorToast(model.error); + } }, ), ), Container( - margin: - EdgeInsets.only(left: 16, right: 16, top: 0.0, bottom: 8), + margin: EdgeInsets.only( + left: 16, right: 16, top: 0.0, bottom: 8), child: BorderedButton( TranslationBase.of(context).cancel, hasBorder: true, @@ -110,10 +113,9 @@ class _UcafDetailScreenState extends State { textColor: HexColor("#B8382B"), fontSize: SizeConfig.textMultiplier * 2.2, handler: () { - Navigator.of(context).popUntil((route){ + Navigator.of(context).popUntil((route) { return route.settings.name == PATIENTS_PROFILE; }); - }, ), ), @@ -164,7 +166,7 @@ class _UcafDetailScreenState extends State { if (__treatmentSteps.indexOf(item) == 0) { await model.getPatientAssessment(patient); } else if (__treatmentSteps.indexOf(item) == 1) { - print("call Medications"); + await model.getPrescription(patient); } if (__treatmentSteps.indexOf(item) == 2) { await model.getOrderProcedures(patient); @@ -198,7 +200,14 @@ class _UcafDetailScreenState extends State { } break; case 1: - return [...List.generate(2, (index) => MedicationWidget()).toList()]; + return [ + ...List.generate( + model.prescriptionList != null + ? model.prescriptionList.entityList.length + : 0, + (index) => MedicationWidget( + model, model.prescriptionList.entityList[index])).toList() + ]; break; case 2: if (model.orderProcedures != null) { @@ -326,6 +335,11 @@ class DiagnosisWidget extends StatelessWidget { } class MedicationWidget extends StatelessWidget { + final UcafViewModel model; + final EntityList prescription; + + MedicationWidget(this.model, this.prescription); + @override Widget build(BuildContext context) { return Column( @@ -339,7 +353,7 @@ class MedicationWidget extends StatelessWidget { fontSize: SizeConfig.textMultiplier * 2.0, ), AppText( - "6", + "${prescription.medicineCode}", fontWeight: FontWeight.normal, fontSize: SizeConfig.textMultiplier * 2.0, ), @@ -352,7 +366,7 @@ class MedicationWidget extends StatelessWidget { fontSize: SizeConfig.textMultiplier * 2.0, ), AppText( - "35.6", + "${prescription.medicationPrice}", fontWeight: FontWeight.normal, fontSize: SizeConfig.textMultiplier * 2.0, ), @@ -365,7 +379,24 @@ class MedicationWidget extends StatelessWidget { fontSize: SizeConfig.textMultiplier * 2.0, ), AppText( - "3", + "${prescription.quantity}", + fontWeight: FontWeight.normal, + fontSize: SizeConfig.textMultiplier * 2.0, + ), + ], + ), + SizedBox( + height: 4, + ), + Row( + children: [ + AppText( + "${TranslationBase.of(context).durDays}: ", + fontWeight: FontWeight.bold, + fontSize: SizeConfig.textMultiplier * 2.0, + ), + AppText( + "${prescription.doseDurationDays}", fontWeight: FontWeight.normal, fontSize: SizeConfig.textMultiplier * 2.0, ), @@ -378,7 +409,7 @@ class MedicationWidget extends StatelessWidget { children: [ Expanded( child: AppText( - "EVE SKIN CREAM WITH HONEY -170GM", + "${prescription.medicationName}", fontWeight: FontWeight.bold, fontSize: SizeConfig.textMultiplier * 2.0, ), @@ -392,7 +423,7 @@ class MedicationWidget extends StatelessWidget { children: [ Expanded( child: AppText( - "Every other day for 5 days", + "${prescription.doseDetail}", fontWeight: FontWeight.normal, fontSize: SizeConfig.textMultiplier * 2.0, ), diff --git a/lib/screens/patients/profile/UCAF/UCAF-input-screen.dart b/lib/screens/patients/profile/UCAF/UCAF-input-screen.dart index 9b9ae5a5..d4c1b803 100644 --- a/lib/screens/patients/profile/UCAF/UCAF-input-screen.dart +++ b/lib/screens/patients/profile/UCAF/UCAF-input-screen.dart @@ -233,7 +233,7 @@ class _UCAFInputScreenState extends State { controller: _additionalComplaintsController, keyboardType: TextInputType.multiline, minLines: 1, - maxLines: 15, + maxLines: 20, )), SizedBox( height: 16, diff --git a/lib/screens/patients/profile/admission-request/admission-request-detail-screen.dart b/lib/screens/patients/profile/admission-request/admission-request-detail-screen.dart index 76ce6e2b..23e33db3 100644 --- a/lib/screens/patients/profile/admission-request/admission-request-detail-screen.dart +++ b/lib/screens/patients/profile/admission-request/admission-request-detail-screen.dart @@ -1,5 +1,6 @@ import 'package:doctor_app_flutter/config/size_config.dart'; import 'package:doctor_app_flutter/core/viewModel/patient-admission-request-viewmodel.dart'; +import 'package:doctor_app_flutter/core/viewModel/project_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/date-utils.dart'; @@ -12,6 +13,7 @@ import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/dialogs/dailog-list-select.dart'; import 'package:flutter/material.dart'; import 'package:hexcolor/hexcolor.dart'; +import 'package:provider/provider.dart'; import '../../../../routes.dart'; @@ -32,6 +34,7 @@ class _AdmissionRequestDetailScreenState final routeArgs = ModalRoute.of(context).settings.arguments as Map; PatiantInformtion patient = routeArgs['patient']; final screenSize = MediaQuery.of(context).size; + ProjectViewModel projectViewModel = Provider.of(context); return BaseView( onModelReady: (model) => model.getSpecialityList(), @@ -124,7 +127,7 @@ class _AdmissionRequestDetailScreenState ListSelectDialog( list: model.speciality, attributeName: - model.selectedLanguage == 'ar' + projectViewModel.isArabic ? 'nameAr' : 'nameEn', attributeValueId: 'id', @@ -151,8 +154,7 @@ class _AdmissionRequestDetailScreenState TranslationBase.of(context) .speciality, _selectedSpeciality != null - ? model.selectedLanguage == - 'ar' + ? projectViewModel.isArabic ? _selectedSpeciality[ 'nameAr'] : _selectedSpeciality[ diff --git a/lib/screens/patients/profile/admission-request/admission-request-third-screen.dart b/lib/screens/patients/profile/admission-request/admission-request-third-screen.dart index aacff6dd..f5dbf704 100644 --- a/lib/screens/patients/profile/admission-request/admission-request-third-screen.dart +++ b/lib/screens/patients/profile/admission-request/admission-request-third-screen.dart @@ -1,29 +1,43 @@ 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/model/admissionRequest/admission-request.dart'; import 'package:doctor_app_flutter/core/viewModel/patient-admission-request-viewmodel.dart'; +import 'package:doctor_app_flutter/core/viewModel/project_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/date-utils.dart'; +import 'package:doctor_app_flutter/util/dr_app_toast_msg.dart'; import 'package:doctor_app_flutter/util/helpers.dart'; import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; import 'package:doctor_app_flutter/widgets/patients/profile/patient-page-header-widget.dart'; import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.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/dialogs/dailog-list-select.dart'; +import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:hexcolor/hexcolor.dart'; +import 'package:provider/provider.dart'; + +import '../../../../routes.dart'; class AdmissionRequestThirdScreen extends StatefulWidget { @override - _AdmissionRequestThirdScreenState createState() => _AdmissionRequestThirdScreenState(); + _AdmissionRequestThirdScreenState createState() => + _AdmissionRequestThirdScreenState(); } -class _AdmissionRequestThirdScreenState extends State { - +class _AdmissionRequestThirdScreenState + extends State { final _postPlansEstimatedCostController = TextEditingController(); final _dietTypeRemarksController = TextEditingController(); - DateTime _dischargeDate; + final _estimatedCostController = TextEditingController(); + + // DateTime _dischargeDate; + dynamic _selectedClinic; + dynamic _selectedDoctor; dynamic _selectedDietType; @override @@ -31,162 +45,364 @@ class _AdmissionRequestThirdScreenState extends State( - // onModelReady: (model) => model.getMasterLookup(), builder: (_, model, w) => AppScaffold( baseViewModel: model, appBarTitle: TranslationBase.of(context).admissionRequest, body: model.doctorsList != null ? Column( - children: [ - Expanded( - child: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - PatientPageHeaderWidget(patient), - Container( - margin: EdgeInsets.symmetric( - vertical: 16, horizontal: 16), + children: [ + Expanded( + child: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - SizedBox( - height: 16, - ), - AppText( - TranslationBase.of(context).postPlansEstimatedCost, - fontWeight: FontWeight.bold, - fontSize: SizeConfig.textMultiplier * 2.5, - ), - SizedBox( - height: 10, - ), + PatientPageHeaderWidget(patient), Container( - child: TextField( - decoration: - Helpers.textFieldSelectorDecoration( - TranslationBase.of(context) - .postPlansEstimatedCost, - null, - false), - enabled: true, - controller: _postPlansEstimatedCostController, - keyboardType: TextInputType.text, - minLines: 4, - maxLines: 6, - )), - SizedBox( - height: 10, - ), - Container( - height: screenSize.height * 0.070, - child: InkWell( - onTap: () { - if (_dischargeDate == null) { - _dischargeDate = DateTime.now(); - } - _selectDate( - context, _dischargeDate, - (picked) { - setState(() { - _dischargeDate = picked; - }); - }); - }, - child: TextField( - decoration: - Helpers.textFieldSelectorDecoration( - TranslationBase.of(context) - .expectedAdmissionDate, - _dischargeDate != null - ? "${DateUtils.convertStringToDateFormat(_dischargeDate.toString(), "yyyy-MM-dd")}" + margin: EdgeInsets.symmetric( + vertical: 16, horizontal: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 16, + ), + AppText( + TranslationBase.of(context) + .specialityAndDoctorDetail, + fontWeight: FontWeight.bold, + fontSize: SizeConfig.textMultiplier * 2.5, + ), + SizedBox( + height: 10, + ), + SizedBox( + height: 20, + ), + Container( + height: screenSize.height * 0.070, + child: InkWell( + onTap: model.clinicList != null && + model.clinicList.length > 0 + ? () { + openListDialogField( + 'clinicGroupName', + 'clinicID', + model.clinicList, + (selectedValue) { + setState(() { + _selectedClinic = selectedValue; + }); + }); + } + : () async { + GifLoaderDialogUtils.showMyDialog( + context); + await model.getClinics().then((_) => + GifLoaderDialogUtils.hideDialog( + context)); + if (model.state == ViewState.Idle && + model.clinicList.length > 0) { + openListDialogField( + 'clinicGroupName', + 'clinicID', + model.clinicList, + (selectedValue) { + setState(() { + _selectedClinic = + selectedValue; + }); + }); + } else if (model.state == + ViewState.ErrorLocal) { + DrAppToastMsg.showErrorToast( + model.error); + } else { + DrAppToastMsg.showErrorToast( + "Empty List"); + } + }, + child: TextField( + decoration: + Helpers.textFieldSelectorDecoration( + TranslationBase.of(context) + .clinic, + _selectedClinic != null + ? _selectedClinic[ + 'clinicGroupName'] + : null, + true), + enabled: false, + ), + ), + ), + SizedBox( + height: 20, + ), + Container( + height: screenSize.height * 0.070, + child: InkWell( + onTap: _selectedClinic != null + ? model.doctorsList != null && + model.doctorsList.length > 0 + ? () { + openListDialogField( + 'DoctorName', + 'DoctorID', + model.doctorsList, + (selectedValue) { + setState(() { + _selectedDoctor = + selectedValue; + }); + }); + } + : () async { + GifLoaderDialogUtils + .showMyDialog(context); + await model + .getClinicDoctors( + _selectedClinic[ + 'clinicID']) + .then((_) => + GifLoaderDialogUtils + .hideDialog( + context)); + if (model.state == + ViewState.Idle && + model.doctorsList.length > + 0) { + openListDialogField( + 'DoctorName', + 'DoctorID', + model.doctorsList, + (selectedValue) { + setState(() { + _selectedDoctor = + selectedValue; + }); + }); + } else if (model.state == + ViewState.ErrorLocal) { + DrAppToastMsg.showErrorToast( + model.error); + } else { + DrAppToastMsg.showErrorToast( + "Empty List"); + } + } : null, - true, - suffixIcon: Icon( - Icons.calendar_today, - color: Colors.black, + child: TextField( + decoration: + Helpers.textFieldSelectorDecoration( + TranslationBase.of(context) + .doctor, + _selectedDoctor != null + ? _selectedDoctor[ + 'DoctorName'] + : null, + true), + enabled: false, + ), + ), + ), + SizedBox( + height: 10, + ), + AppText( + TranslationBase.of(context) + .postPlansEstimatedCost, + fontWeight: FontWeight.bold, + fontSize: SizeConfig.textMultiplier * 2.5, + ), + SizedBox( + height: 10, + ), + Container( + height: screenSize.height * 0.070, + child: TextField( + decoration: + Helpers.textFieldSelectorDecoration( + TranslationBase.of(context) + .estimatedCost, + null, + false), + enabled: true, + controller: _estimatedCostController, + inputFormatters: [ + FilteringTextInputFormatter.allow( + RegExp(ONLY_NUMBERS)) + ], + keyboardType: TextInputType.number, )), - enabled: false, - ), - ), - ), - SizedBox( - height: 10, - ), - Container( - height: screenSize.height * 0.070, - child: InkWell( - onTap: /*model.doctorsList != null && - model.doctorsList.length > 0 + SizedBox( + height: 10, + ), + Container( + child: TextField( + decoration: + Helpers.textFieldSelectorDecoration( + TranslationBase.of(context).postPlans, + null, + false), + enabled: true, + controller: _postPlansEstimatedCostController, + keyboardType: TextInputType.text, + minLines: 4, + maxLines: 6, + )), + SizedBox( + height: 10, + ), + /* Container( + height: screenSize.height * 0.070, + child: InkWell( + onTap: () { + if (_dischargeDate == null) { + _dischargeDate = DateTime.now(); + } + _selectDate(context, _dischargeDate, + (picked) { + setState(() { + _dischargeDate = picked; + }); + }); + }, + child: TextField( + decoration: + Helpers.textFieldSelectorDecoration( + TranslationBase.of(context) + .expectedAdmissionDate, + _dischargeDate != null + ? "${DateUtils.convertStringToDateFormat(_dischargeDate.toString(), "yyyy-MM-dd")}" + : null, + true, + suffixIcon: Icon( + Icons.calendar_today, + color: Colors.black, + )), + enabled: false, + ), + ), + ), + SizedBox( + height: 10, + ),*/ + Container( + height: screenSize.height * 0.070, + child: InkWell( + onTap: model.dietTypesList != null && + model.dietTypesList.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: Helpers.textFieldSelectorDecoration( - TranslationBase.of(context).dietType, - /* _admissionType != null - ? _admissionType['DoctorName'] - :*/ null, - true), - enabled: false, - ), + openListDialogField('nameEn', 'id', + model.dietTypesList, + (selectedValue) { + setState(() { + _selectedDietType = + selectedValue; + }); + }); + } + : () async { + GifLoaderDialogUtils.showMyDialog( + context); + await model.getDietTypes().then( + (_) => GifLoaderDialogUtils + .hideDialog(context)); + if (model.state == ViewState.Idle && + model.dietTypesList.length > + 0) { + openListDialogField('nameEn', + 'id', model.dietTypesList, + (selectedValue) { + setState(() { + _selectedDietType = + selectedValue; + }); + }); + } else if (model.state == + ViewState.ErrorLocal) { + DrAppToastMsg.showErrorToast( + model.error); + } else { + DrAppToastMsg.showErrorToast( + "Empty List"); + } + }, + child: TextField( + decoration: + Helpers.textFieldSelectorDecoration( + TranslationBase.of(context) + .dietType, + _selectedDietType != null + ? _selectedDietType['nameEn'] + : null, + true), + enabled: false, + ), + ), + ), + SizedBox( + height: 10, + ), + Container( + child: TextField( + decoration: + Helpers.textFieldSelectorDecoration( + TranslationBase.of(context) + .dietTypeRemarks, + null, + false), + enabled: true, + controller: _dietTypeRemarksController, + keyboardType: TextInputType.text, + minLines: 4, + maxLines: 6, + )), + ], ), ), - SizedBox( - height: 10, - ), - Container( - child: TextField( - decoration: - Helpers.textFieldSelectorDecoration( - TranslationBase.of(context) - .dietTypeRemarks, - null, - false), - enabled: true, - controller: _dietTypeRemarksController, - keyboardType: TextInputType.text, - minLines: 4, - maxLines: 6, - )), ], ), ), - ], - ), - ), - ), - Container( - margin: EdgeInsets.symmetric(horizontal: 16, vertical: 8), - child: AppButton( - title: TranslationBase.of(context).save, - color: HexColor("#B8382B"), - onPressed: null, - ), - ), - ], - ) + ), + Container( + margin: EdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: AppButton( + title: TranslationBase.of(context).next, + color: HexColor("#B8382B"), + onPressed: () { + model.admissionRequestData = AdmissionRequest(); + if (_selectedClinic != null && + _selectedDoctor != null && + _estimatedCostController.text != "" && + _postPlansEstimatedCostController.text != "") { + model.admissionRequestData.patientMRN = patient.patientMRN; + model.admissionRequestData.appointmentNo = patient.appointmentNo; + model.admissionRequestData.episodeID = patient.episodeNo; + model.admissionRequestData.admissionRequestNo = 0; + + model.admissionRequestData.admitToClinic = _selectedClinic['clinicID']; + model.admissionRequestData.mrpDoctorID = _selectedDoctor['DoctorID']; + model.admissionRequestData.estimatedCost = int.parse(_estimatedCostController.text); + model.admissionRequestData.elementsForImprovement = _postPlansEstimatedCostController.text; + model.admissionRequestData.isDietType = _selectedDietType != null ? true : false; + model.admissionRequestData.dietType = _selectedDietType != null ? _selectedDietType['id'] : 0; + model.admissionRequestData.dietRemarks = _dietTypeRemarksController.text; + Navigator.of(context).pushNamed( + PATIENT_ADMISSION_REQUEST_2, + arguments: {'patient': patient, 'admission-data' : model.admissionRequestData}); + } else { + DrAppToastMsg.showErrorToast( + TranslationBase.of(context).pleaseFill); + } + }, + ), + ), + ], + ) : Container(), ), ); @@ -205,4 +421,25 @@ class _AdmissionRequestThirdScreenState extends State list, Function(dynamic selectedValue) okFunction) { + ListSelectDialog dialog = ListSelectDialog( + list: list, + attributeName: attributeName, + attributeValueId: attributeValueId, + usingSearch: true, + okText: TranslationBase.of(context).ok, + okFunction: (selectedValue) { + okFunction(selectedValue); + }, + ); + showDialog( + barrierDismissible: false, + context: context, + builder: (BuildContext context) { + return dialog; + }, + ); + } } diff --git a/lib/screens/patients/profile/admission-request/admission-request_second-screen.dart b/lib/screens/patients/profile/admission-request/admission-request_second-screen.dart index b65b7f43..2ffd5455 100644 --- a/lib/screens/patients/profile/admission-request/admission-request_second-screen.dart +++ b/lib/screens/patients/profile/admission-request/admission-request_second-screen.dart @@ -2,6 +2,7 @@ import 'package:doctor_app_flutter/config/config.dart'; import 'package:doctor_app_flutter/config/size_config.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/model/admissionRequest/admission-request.dart'; import 'package:doctor_app_flutter/core/viewModel/patient-admission-request-viewmodel.dart'; import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart'; import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart'; @@ -15,6 +16,7 @@ import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.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/dialogs/dailog-list-select.dart'; +import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:hexcolor/hexcolor.dart'; @@ -32,20 +34,29 @@ class _AdmissionRequestSecondScreenState extends State { final _expectedDaysController = TextEditingController(); final _treatmentLineController = TextEditingController(); - final _preOperativeOrdersController = TextEditingController(); + + // final _preOperativeOrdersController = TextEditingController(); DateTime _expectedAdmissionDate; - bool _emergencyAdmission = false; + + // bool _emergencyAdmission = false; + bool _isSickLeaveRequired = false; bool _patientPregnant = false; - bool _preAnesthesiaReferred = false; + + // bool _preAnesthesiaReferred = false; dynamic _selectedWard; dynamic _selectedAdmissionType; dynamic _selectedDiagnosis; - dynamic _selectedAllergies; + dynamic _selectedIcd; + dynamic _selectedDiagnosisType; + + // dynamic _selectedAllergies; @override Widget build(BuildContext context) { final routeArgs = ModalRoute.of(context).settings.arguments as Map; PatiantInformtion patient = routeArgs['patient']; + AdmissionRequest admissionRequest = routeArgs['admission-data']; + final screenSize = MediaQuery.of(context).size; ProjectViewModel projectViewModel = Provider.of(context); @@ -134,6 +145,7 @@ class _AdmissionRequestSecondScreenState SizedBox( height: 10, ), +/* CheckboxListTile( title: AppText( TranslationBase.of(context) @@ -151,6 +163,24 @@ class _AdmissionRequestSecondScreenState ListTileControlAffinity.leading, contentPadding: EdgeInsets.all(0), ), +*/ + CheckboxListTile( + title: AppText( + TranslationBase.of(context) + .isSickLeaveRequired, + fontWeight: FontWeight.normal, + fontSize: SizeConfig.textMultiplier * 2.1, + ), + value: _isSickLeaveRequired, + onChanged: (newValue) { + setState(() { + _isSickLeaveRequired = newValue; + }); + }, + controlAffinity: + ListTileControlAffinity.leading, + contentPadding: EdgeInsets.all(0), + ), CheckboxListTile( title: AppText( TranslationBase.of(context).patientPregnant, @@ -199,7 +229,11 @@ class _AdmissionRequestSecondScreenState }); } : () async { - await model.getWards(); + GifLoaderDialogUtils.showMyDialog( + context); + await model.getWards().then((_) => + GifLoaderDialogUtils.hideDialog( + context)); if (model.state == ViewState.Idle && model.wardList.length > 0) { openListDialogField('description', @@ -230,7 +264,7 @@ class _AdmissionRequestSecondScreenState ), ), ), - CheckboxListTile( + /* CheckboxListTile( title: AppText( TranslationBase.of(context) .preAnesthesiaReferred, @@ -246,6 +280,9 @@ class _AdmissionRequestSecondScreenState controlAffinity: ListTileControlAffinity.leading, contentPadding: EdgeInsets.all(0), + ),*/ + SizedBox( + height: 10, ), Container( height: screenSize.height * 0.070, @@ -263,9 +300,15 @@ class _AdmissionRequestSecondScreenState }); } : () async { - await model.getMasterLookup( - MasterKeysService - .AdmissionRequestType); + GifLoaderDialogUtils.showMyDialog( + context); + await model + .getMasterLookup( + MasterKeysService + .AdmissionRequestType) + .then((_) => + GifLoaderDialogUtils + .hideDialog(context)); if (model.state == ViewState.Idle && model.admissionTypeList.length > 0) { @@ -303,6 +346,17 @@ class _AdmissionRequestSecondScreenState SizedBox( height: 10, ), + SizedBox( + height: 16, + ), + AppText( + TranslationBase.of(context).diagnosisDetail, + fontWeight: FontWeight.bold, + fontSize: SizeConfig.textMultiplier * 2.5, + ), + SizedBox( + height: 10, + ), Container( height: screenSize.height * 0.070, child: InkWell( @@ -319,7 +373,11 @@ class _AdmissionRequestSecondScreenState }); } : () async { - await model.getDiagnosis(); + GifLoaderDialogUtils.showMyDialog( + context); + await model.getDiagnosis().then( + (_) => GifLoaderDialogUtils + .hideDialog(context)); if (model.state == ViewState.Idle && model.diagnosisTypesList .length > @@ -360,6 +418,133 @@ class _AdmissionRequestSecondScreenState height: 10, ), Container( + height: screenSize.height * 0.070, + child: InkWell( + onTap: model.icdCodes != null && + model.icdCodes.length > 0 + ? () { + openListDialogField('description', + 'code', model.icdCodes, + (selectedValue) { + setState(() { + _selectedIcd = selectedValue; + }); + }); + } + : () async { + GifLoaderDialogUtils.showMyDialog( + context); + await model + .getICDCodes(patient.patientMRN) + .then((_) => + GifLoaderDialogUtils + .hideDialog(context)); + if (model.state == ViewState.Idle && + model.icdCodes.length > 0) { + openListDialogField('description', + 'code', model.icdCodes, + (selectedValue) { + setState(() { + _selectedIcd = selectedValue; + }); + }); + } else if (model.state == + ViewState.ErrorLocal) { + DrAppToastMsg.showErrorToast( + model.error); + } else { + DrAppToastMsg.showErrorToast( + "Empty List"); + } + }, + child: TextField( + decoration: + Helpers.textFieldSelectorDecoration( + TranslationBase.of(context).icd, + _selectedIcd != null + ? _selectedIcd['description'] + : null, + true), + enabled: false, + ), + ), + ), + SizedBox( + height: 10, + ), + Container( + height: screenSize.height * 0.070, + child: InkWell( + onTap: model.listOfDiagnosisSelectionTypes != + null && + model.listOfDiagnosisSelectionTypes + .length > + 0 + ? () { + openListDialogField( + 'description', + 'code', + model + .listOfDiagnosisSelectionTypes, + (selectedValue) { + setState(() { + _selectedDiagnosisType = + selectedValue; + }); + }); + } + : () async { + GifLoaderDialogUtils.showMyDialog( + context); + await model + .getMasterLookup( + MasterKeysService + .DiagnosisSelectionType) + .then((_) => + GifLoaderDialogUtils + .hideDialog(context)); + if (model.state == ViewState.Idle && + model.listOfDiagnosisSelectionTypes + .length > + 0) { + openListDialogField( + 'description', + 'code', + model + .listOfDiagnosisSelectionTypes, + (selectedValue) { + setState(() { + _selectedDiagnosisType = + selectedValue; + }); + }); + } else if (model.state == + ViewState.ErrorLocal) { + DrAppToastMsg.showErrorToast( + model.error); + } else { + DrAppToastMsg.showErrorToast( + "Empty List"); + } + }, + child: TextField( + decoration: + Helpers.textFieldSelectorDecoration( + TranslationBase.of(context) + .diagnoseType, + _selectedDiagnosisType != null + ? _selectedDiagnosisType[ + 'description'] + : null, + true), + enabled: false, + ), + ), + ), + SizedBox( + height: 10, + ), + /*Container( child: TextField( decoration: Helpers.textFieldSelectorDecoration( @@ -425,7 +610,7 @@ class _AdmissionRequestSecondScreenState enabled: false, ), ), - ), + ),*/ ], ), ), @@ -436,12 +621,48 @@ class _AdmissionRequestSecondScreenState Container( margin: EdgeInsets.symmetric(horizontal: 16, vertical: 8), child: AppButton( - title: TranslationBase.of(context).next, + title: TranslationBase.of(context).save, color: HexColor("#B8382B"), - onPressed: () { - Navigator.of(context).pushNamed( - PATIENT_ADMISSION_REQUEST_3, - arguments: {'patient': patient}); + onPressed: () async { + if (_expectedDaysController.text != "" && + _expectedAdmissionDate != null && + _treatmentLineController.text != "" && + _selectedWard != null && + _selectedAdmissionType != null && + _selectedDiagnosis != null && + _selectedIcd != null && + _selectedDiagnosisType != null) { + model.admissionRequestData = admissionRequest; + + model.admissionRequestData.expectedDays = int.parse(_expectedDaysController.text); + model.admissionRequestData.admissionDate = _expectedAdmissionDate.toIso8601String(); + model.admissionRequestData.isSickLeaveRequired = _isSickLeaveRequired; + model.admissionRequestData.isPregnant = _patientPregnant; + model.admissionRequestData.mainLineOfTreatment = _treatmentLineController.text; + model.admissionRequestData.wardID = 0; + model.admissionRequestData.admissionType = _selectedAdmissionType['id']; + dynamic admissionRequestDiagnoses = [ + { + 'diagnosisDescription' : _selectedDiagnosis['nameEn'], + 'diagnosisType' : _selectedDiagnosis['id'], + 'icdCode' : _selectedIcd['code'], + 'icdCodeDescription' : _selectedIcd['description'], + 'type' : _selectedDiagnosisType['code'], + 'remarks' : "", + 'isActive' : true, + } + ]; + model.admissionRequestData.admissionRequestDiagnoses = admissionRequestDiagnoses; + model.admissionRequestData.admissionRequestProcedures = []; + await model.makeAdmissionRequest(); + if(model.state == ViewState.ErrorLocal){ + DrAppToastMsg.showErrorToast( + model.error); + } + } else { + DrAppToastMsg.showErrorToast( + TranslationBase.of(context).pleaseFill); + } }, ), ), @@ -486,38 +707,4 @@ class _AdmissionRequestSecondScreenState }, ); } - -/* - onTap: model.wardList != null && - model.wardList.length > 0 - ? () { - openListDialogField('description', - 'description', model.wardList, - (selectedValue) { - setState(() { - _selectedWard = selectedValue; - }); - }); - } - : () async { - await model.getWards(); - if (model.state == ViewState.Idle && - model.wardList.length > 0) { - openListDialogField('description', - 'description', model.wardList, - (selectedValue) { - setState(() { - _selectedWard = selectedValue; - }); - }); - } else if (model.state == - ViewState.ErrorLocal) { - DrAppToastMsg.showErrorToast( - model.error); - } else { - DrAppToastMsg.showErrorToast( - "Empty List"); - } - }, - */ } diff --git a/lib/screens/patients/profile/referral/my-referral-patient-screen.dart b/lib/screens/patients/profile/referral/my-referral-patient-screen.dart index ab2beaf8..5e749011 100644 --- a/lib/screens/patients/profile/referral/my-referral-patient-screen.dart +++ b/lib/screens/patients/profile/referral/my-referral-patient-screen.dart @@ -73,6 +73,8 @@ class MyReferralPatientScreen extends StatelessWidget { remark: model.pendingReferral[index].remarksFromSource, referredOn: model.pendingReferral[index].referredOn, + answerFromTarget: + model.pendingReferral[index].answerFromTarget, infoIcon: InkWell( onTap: () { Navigator.of(context) diff --git a/lib/screens/patients/profile/referral/refer-patient-screen.dart b/lib/screens/patients/profile/referral/refer-patient-screen.dart index a3d74430..3903b46a 100644 --- a/lib/screens/patients/profile/referral/refer-patient-screen.dart +++ b/lib/screens/patients/profile/referral/refer-patient-screen.dart @@ -103,6 +103,8 @@ class _PatientMakeReferralScreenState extends State { clinicDescription: null, remark: model.patientReferral[0].remarksFromSource, referredOn: model.patientReferral[0].referredOn, + answerFromTarget: + model.patientReferral[0].answerFromTarget, ), ], ), @@ -271,7 +273,8 @@ class _PatientMakeReferralScreenState extends State { attributeName: 'ClinicDescription', attributeValueId: 'ClinicID', usingSearch: true, - hintSearchText: TranslationBase.of(context).clinicSearch, + hintSearchText: + TranslationBase.of(context).clinicSearch, okText: TranslationBase.of(context).ok, okFunction: (selectedValue) { setState(() { @@ -321,7 +324,8 @@ class _PatientMakeReferralScreenState extends State { attributeName: 'DoctorName', attributeValueId: 'DoctorID', usingSearch: true, - hintSearchText: TranslationBase.of(context).doctorSearch, + hintSearchText: + TranslationBase.of(context).doctorSearch, okText: TranslationBase.of(context).ok, okFunction: (selectedValue) { setState(() { @@ -380,9 +384,9 @@ class _PatientMakeReferralScreenState extends State { TranslationBase.of(context).remarks, null, false), enabled: true, controller: _remarksController, - inputFormatters: [ - FilteringTextInputFormatter.allow(RegExp(ONLY_LETTERS)) - ], + // inputFormatters: [ + // FilteringTextInputFormatter.allow(RegExp(ONLY_LETTERS)) + // ], keyboardType: TextInputType.text, minLines: 4, maxLines: 6, @@ -406,53 +410,6 @@ class _PatientMakeReferralScreenState extends State { setState(() { appointmentDate = picked; }); - /* model - .getPatientArrivalList(DateUtils.convertStringToDateFormat( - appointmentDate.toString(), "yyyy-MM-dd")) - .then((_) { - if (model.state == ViewState.ErrorLocal) { - helpers.showErrorToast(model.error); - return; - } - if (model.patientArrivalList != null && - model.patientArrivalList.length > 0) { - List appointments = model.getAppointmentsByPatientName( - "${patient.firstName} ${patient.middleName} ${patient.lastName}"); - if (appointments.length > 0) { - ListSelectDialog dialog = ListSelectDialog( - list: appointments, - attributeName: 'appointmentNo', - attributeValueId: 'appointmentNo', - okText: TranslationBase.of(context).ok, - okFunction: (selectedValue) { - setState(() { - _selectedPatientArrivalEntity = - PatientArrivalEntity.fromJson(selectedValue); - }); - }, - ); - showDialog( - barrierDismissible: false, - context: context, - builder: (BuildContext context) { - return dialog; - }, - ); - } else { - setState(() { - _selectedPatientArrivalEntity = null; - }); - DrAppToastMsg.showErrorToast( - TranslationBase.of(context).noAppointmentsErrorMsg); - } - } else { - setState(() { - _selectedPatientArrivalEntity = null; - }); - DrAppToastMsg.showErrorToast( - TranslationBase.of(context).noAppointmentsErrorMsg); - } - });*/ } } } diff --git a/lib/util/translations_delegate_base.dart b/lib/util/translations_delegate_base.dart index cfb57edb..305d91f6 100644 --- a/lib/util/translations_delegate_base.dart +++ b/lib/util/translations_delegate_base.dart @@ -726,6 +726,8 @@ class TranslationBase { String get emergencyAdmission => localizedValues['emergencyAdmission'][locale.languageCode]; + String get isSickLeaveRequired => + localizedValues['isSickLeaveRequired'][locale.languageCode]; String get patientPregnant => localizedValues['patientPregnant'][locale.languageCode]; @@ -763,6 +765,8 @@ class TranslationBase { String get postPlansEstimatedCost => localizedValues['postPlansEstimatedCost'][locale.languageCode]; + String get postPlans => + localizedValues['postPlans'][locale.languageCode]; String get ucaf => localizedValues['ucaf'][locale.languageCode]; @@ -866,6 +870,8 @@ class TranslationBase { String get quantity => localizedValues['quantity'][locale.languageCode]; + String get durDays => localizedValues['durDays'][locale.languageCode]; + String get codeNo => localizedValues['codeNo'][locale.languageCode]; String get covered => localizedValues['covered'][locale.languageCode]; @@ -1071,6 +1077,9 @@ String get ICDName => String get referralStatusNotSeen => localizedValues['referralStatusNotSeen'][locale.languageCode]; String get clinicSearch => localizedValues['clinicSearch'][locale.languageCode]; String get doctorSearch => localizedValues['doctorSearch'][locale.languageCode]; + String get referralResponse => localizedValues['referralResponse'][locale.languageCode]; + String get estimatedCost => localizedValues['estimatedCost'][locale.languageCode]; + String get diagnosisDetail => localizedValues['diagnosisDetail'][locale.languageCode]; String get patientName => localizedValues['patient-name'][locale.languageCode]; diff --git a/lib/widgets/patients/patient-referral-item-widget.dart b/lib/widgets/patients/patient-referral-item-widget.dart index ab89ab33..5924c89c 100644 --- a/lib/widgets/patients/patient-referral-item-widget.dart +++ b/lib/widgets/patients/patient-referral-item-widget.dart @@ -12,6 +12,7 @@ class PatientReferralItemWidget extends StatelessWidget { final String clinicDescription; final String remark; final String referredOn; + final String answerFromTarget; final Widget infoIcon; PatientReferralItemWidget( @@ -24,6 +25,7 @@ class PatientReferralItemWidget extends StatelessWidget { this.clinicDescription, this.remark, this.referredOn, + this.answerFromTarget, this.infoIcon, }); @@ -207,6 +209,27 @@ class PatientReferralItemWidget extends StatelessWidget { ), ], ), + if (answerFromTarget != null) + SizedBox( + height: 8, + ), + if (answerFromTarget != null) + Row( + children: [ + AppText( + TranslationBase.of(context).referralResponse, + color: Colors.grey, + fontWeight: FontWeight.bold, + fontSize: 12, + ), + AppText( + answerFromTarget != "" ? answerFromTarget : '-', + color: Colors.black, + fontWeight: FontWeight.bold, + fontSize: 12, + ), + ], + ), SizedBox( height: 16, ),