From 97dbe62f93e03e1dd6d95b870d95e959f38c2a07 Mon Sep 17 00:00:00 2001 From: Amjad Amireh Date: Thu, 13 Aug 2020 14:53:04 +0300 Subject: [PATCH] done report service --- lib/config/config.dart | 5 + lib/core/enum/filter_type.dart | 1 + lib/core/enum/reportfilter_type.dart | 1 + lib/core/model/reports/Reports.dart | 137 +++++++++++++++++ lib/core/model/reports/request_reports.dart | 76 ++++++++++ lib/core/service/medical/reports_service.dart | 66 ++++++++ .../medical/reports_view_model.dart | 127 ++++++++++++++++ lib/locator.dart | 5 + lib/pages/medical/medical_profile_page.dart | 8 + .../medical/reports/report_home_page.dart | 142 ++++++++++++++++++ lib/pages/medical/reports/reports_page.dart | 10 ++ 11 files changed, 578 insertions(+) create mode 100644 lib/core/enum/reportfilter_type.dart create mode 100644 lib/core/model/reports/Reports.dart create mode 100644 lib/core/model/reports/request_reports.dart create mode 100644 lib/core/service/medical/reports_service.dart create mode 100644 lib/core/viewModels/medical/reports_view_model.dart create mode 100644 lib/pages/medical/reports/report_home_page.dart create mode 100644 lib/pages/medical/reports/reports_page.dart diff --git a/lib/config/config.dart b/lib/config/config.dart index 643a2ec9..5b43949e 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -20,6 +20,11 @@ const GET_PRESCRIPTIONS_ALL_ORDERS = '/Patients.svc/REST/PatientER_GetPatientAl const GET_PRESCRIPTION_REPORT = '/Patients.svc/REST/INP_GetPrescriptionReport'; const SEND_PRESCRIPTION_EMAIL = '/Notifications.svc/REST/SendPrescriptionEmail'; + +///Reports +const REPORTS = '/Doctors.svc/REST/GetPatientMedicalReportStatusInfo'; + + //const BASE_URL = 'https://hmgwebservices.com/'; // Production Environment //const BASE_URL = 'https://uat.hmgwebservices.com/Services'; // UAT Environment diff --git a/lib/core/enum/filter_type.dart b/lib/core/enum/filter_type.dart index 9da35c43..4591e023 100644 --- a/lib/core/enum/filter_type.dart +++ b/lib/core/enum/filter_type.dart @@ -1 +1,2 @@ enum FilterType { Clinic, Hospital } + diff --git a/lib/core/enum/reportfilter_type.dart b/lib/core/enum/reportfilter_type.dart new file mode 100644 index 00000000..74cd97c6 --- /dev/null +++ b/lib/core/enum/reportfilter_type.dart @@ -0,0 +1 @@ +enum ReportFilterType { Requested, Ready,Completed,Cancelled } \ No newline at end of file diff --git a/lib/core/model/reports/Reports.dart b/lib/core/model/reports/Reports.dart new file mode 100644 index 00000000..eb09c0c5 --- /dev/null +++ b/lib/core/model/reports/Reports.dart @@ -0,0 +1,137 @@ +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +class Reports { + int status; + DateTime encounterDate; + int projectID; + int invoiceNo; + int encounterNo; + String procedureId; + int requestType; + String setupId; + int patientID; + int doctorID; + Null clinicID; + DateTime requestDate; + bool isRead; + DateTime isReadOn; + int actualDoctorRate; + String clinicDescription; + Null clinicDescriptionN; + String docName; + Null docNameN; + String doctorImageURL; + Null doctorName; + Null doctorNameN; + int doctorRate; + bool isDoctorAllowVedioCall; + bool isExecludeDoctor; + int noOfPatientsRate; + String projectName; + Null projectNameN; + + Reports( + {this.status, + this.encounterDate, + this.projectID, + this.invoiceNo, + this.encounterNo, + this.procedureId, + this.requestType, + this.setupId, + this.patientID, + this.doctorID, + this.clinicID, + this.requestDate, + this.isRead, + this.isReadOn, + this.actualDoctorRate, + this.clinicDescription, + this.clinicDescriptionN, + this.docName, + this.docNameN, + this.doctorImageURL, + this.doctorName, + this.doctorNameN, + this.doctorRate, + this.isDoctorAllowVedioCall, + this.isExecludeDoctor, + this.noOfPatientsRate, + this.projectName, + this.projectNameN}); + + Reports.fromJson(Map json) { + status = json['Status']; + encounterDate = DateUtil.convertStringToDate(json['EncounterDate']);//json['EncounterDate']; + projectID = json['ProjectID']; + invoiceNo = json['InvoiceNo']; + encounterNo = json['EncounterNo']; + procedureId = json['ProcedureId']; + requestType = json['RequestType']; + setupId = json['SetupId']; + patientID = json['PatientID']; + doctorID = json['DoctorID']; + clinicID = json['ClinicID']; + requestDate = DateUtil.convertStringToDate(json['RequestDate']);//json['RequestDate']; + isRead = json['IsRead']; + isReadOn =DateUtil.convertStringToDate(json['IsReadOn']); //json['IsReadOn']; + actualDoctorRate = json['ActualDoctorRate']; + clinicDescription = json['ClinicDescription']; + clinicDescriptionN = json['ClinicDescriptionN']; + docName = json['DocName']; + docNameN = json['DocNameN']; + doctorImageURL = json['DoctorImageURL']; + doctorName = json['DoctorName']; + doctorNameN = json['DoctorNameN']; + doctorRate = json['DoctorRate']; + isDoctorAllowVedioCall = json['IsDoctorAllowVedioCall']; + isExecludeDoctor = json['IsExecludeDoctor']; + noOfPatientsRate = json['NoOfPatientsRate']; + projectName = json['ProjectName']; + projectNameN = json['ProjectNameN']; + } + + Map toJson() { + final Map data = new Map(); + data['Status'] = this.status; + data['EncounterDate'] = this.encounterDate; + data['ProjectID'] = this.projectID; + data['InvoiceNo'] = this.invoiceNo; + data['EncounterNo'] = this.encounterNo; + data['ProcedureId'] = this.procedureId; + data['RequestType'] = this.requestType; + data['SetupId'] = this.setupId; + data['PatientID'] = this.patientID; + data['DoctorID'] = this.doctorID; + data['ClinicID'] = this.clinicID; + data['RequestDate'] = this.requestDate; + data['IsRead'] = this.isRead; + data['IsReadOn'] = this.isReadOn; + data['ActualDoctorRate'] = this.actualDoctorRate; + data['ClinicDescription'] = this.clinicDescription; + data['ClinicDescriptionN'] = this.clinicDescriptionN; + data['DocName'] = this.docName; + data['DocNameN'] = this.docNameN; + data['DoctorImageURL'] = this.doctorImageURL; + data['DoctorName'] = this.doctorName; + data['DoctorNameN'] = this.doctorNameN; + data['DoctorRate'] = this.doctorRate; + data['IsDoctorAllowVedioCall'] = this.isDoctorAllowVedioCall; + data['IsExecludeDoctor'] = this.isExecludeDoctor; + data['NoOfPatientsRate'] = this.noOfPatientsRate; + data['ProjectName'] = this.projectName; + data['ProjectNameN'] = this.projectNameN; + return data; + } +} + + +class ReportsList{ + String filterName=""; + // int filterName=1; + ListreportsList=List(); + ReportsList({this.filterName,Reports reports}){ + reportsList.add(reports); + } + + +} diff --git a/lib/core/model/reports/request_reports.dart b/lib/core/model/reports/request_reports.dart new file mode 100644 index 00000000..14359591 --- /dev/null +++ b/lib/core/model/reports/request_reports.dart @@ -0,0 +1,76 @@ +class RequestReports { + bool isReport; + int encounterType; + int requestType; + double versionID; + int channel; + int languageID; + String iPAdress; + String generalid; + int patientOutSA; + String sessionID; + bool isDentalAllowedBackend; + int deviceTypeID; + int patientID; + String tokenID; + int patientTypeID; + int patientType; + + RequestReports( + {this.isReport, + this.encounterType, + this.requestType, + this.versionID, + this.channel, + this.languageID, + this.iPAdress, + this.generalid, + this.patientOutSA, + this.sessionID, + this.isDentalAllowedBackend, + this.deviceTypeID, + this.patientID, + this.tokenID, + this.patientTypeID, + this.patientType}); + + RequestReports.fromJson(Map json) { + isReport = json['IsReport']; + encounterType = json['EncounterType']; + requestType = json['RequestType']; + versionID = json['VersionID']; + channel = json['Channel']; + languageID = json['LanguageID']; + iPAdress = json['IPAdress']; + generalid = json['generalid']; + patientOutSA = json['PatientOutSA']; + sessionID = json['SessionID']; + isDentalAllowedBackend = json['isDentalAllowedBackend']; + deviceTypeID = json['DeviceTypeID']; + patientID = json['PatientID']; + tokenID = json['TokenID']; + patientTypeID = json['PatientTypeID']; + patientType = json['PatientType']; + } + + Map toJson() { + final Map data = new Map(); + data['IsReport'] = this.isReport; + data['EncounterType'] = this.encounterType; + data['RequestType'] = this.requestType; + data['VersionID'] = this.versionID; + data['Channel'] = this.channel; + data['LanguageID'] = this.languageID; + data['IPAdress'] = this.iPAdress; + data['generalid'] = this.generalid; + data['PatientOutSA'] = this.patientOutSA; + data['SessionID'] = this.sessionID; + data['isDentalAllowedBackend'] = this.isDentalAllowedBackend; + data['DeviceTypeID'] = this.deviceTypeID; + data['PatientID'] = this.patientID; + data['TokenID'] = this.tokenID; + data['PatientTypeID'] = this.patientTypeID; + data['PatientType'] = this.patientType; + return data; + } +} \ No newline at end of file diff --git a/lib/core/service/medical/reports_service.dart b/lib/core/service/medical/reports_service.dart new file mode 100644 index 00000000..6e965e33 --- /dev/null +++ b/lib/core/service/medical/reports_service.dart @@ -0,0 +1,66 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/reports/Reports.dart'; +import 'package:diplomaticquarterapp/core/model/reports/request_reports.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; + + + +class ReportsService extends BaseService{ + + List reportsList = List(); + + RequestReports _requestReports=RequestReports( + isReport: true, + encounterType: 1, + requestType: 1, + versionID: 5.5, + channel: 3, + languageID: 2, + iPAdress: "10.20.10.20", + generalid: 'Cs2020@2016\$2958', + patientOutSA: 0, + sessionID: 'KIbLoqkytuKJEWECHQ', + isDentalAllowedBackend: false, + deviceTypeID: 2, + patientID: 1231755, + tokenID: '@dm!n', + patientTypeID: 1, + patientType: 1 + + + ); + Future getReports() async { + hasError = false; + await baseAppClient.post(REPORTS, + onSuccess: (dynamic response, int statusCode) + { + reportsList.clear(); + + response['GetPatientMedicalStatus'].forEach((reports) { + reportsList.add(Reports.fromJson(reports)); + }); + },onFailure: (String error,int statusCode){ + hasError = true; + super.error = error; + },body: _requestReports.toJson()); + + } + + + + +// Future getPrescriptions() async { +// hasError = false; +// await baseAppClient.post(PRESCRIPTIONS, +// onSuccess: (dynamic response, int statusCode) { +// prescriptionsList.clear(); +// response['PatientPrescriptionList'].forEach((prescriptions) { +// prescriptionsList.add(Prescriptions.fromJson(prescriptions)); +// }); +// }, onFailure: (String error, int statusCode) { +// hasError = true; +// super.error = error; +// }, body: _requestPrescriptions.toJson()); +// } + +} \ No newline at end of file diff --git a/lib/core/viewModels/medical/reports_view_model.dart b/lib/core/viewModels/medical/reports_view_model.dart new file mode 100644 index 00000000..e0a4d8fb --- /dev/null +++ b/lib/core/viewModels/medical/reports_view_model.dart @@ -0,0 +1,127 @@ +//import 'package:diplomaticquarterapp/core/model/prescriptions/prescription_report.dart'; + +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; + +import '../../../core/enum/reportfilter_type.dart'; +import '../../../core/enum/viewstate.dart'; +//import '../../../core/model/prescriptions/Prescriptions.dart'; +import '../../../core/model/reports/Reports.dart'; + +//import '../../../core/service/medical/prescriptions_service.dart'; +import '../../../core/service/medical/reports_service.dart'; + +import '../../../locator.dart'; +import '../base_view_model.dart'; + +class ReportsViewModel extends BaseViewModel { + ReportFilterType filterType = ReportFilterType.Requested; + + ReportsService _reportsService = locator(); + + List _reportsOrderRequestList = List(); + List _reportsOrderReadyList = List(); + List _reportsOrderCompletedList = List(); + List _reportsOrderCanceledList = List(); + + List get reportsList => _reportsService.reportsList; + + ///// + List get reportsOrderList { + switch (filterType) { + case ReportFilterType.Requested: + return _reportsOrderRequestList; + break; + + case ReportFilterType.Ready: + return _reportsOrderReadyList; + break; + + case ReportFilterType.Completed: + return _reportsOrderCompletedList; + break; + + default: + return _reportsOrderCanceledList; + } + } + + getReports() async { + setState(ViewState.Busy); + await _reportsService.getReports(); + if (_reportsService.hasError) { + error = _reportsService.error; + setState(ViewState.Error); + } else { + _filterList(); + setState(ViewState.Idle); + } + } + +//////////////////////// + void _filterList() { + _reportsService.reportsList.forEach((element) { + /// ReportsList list sort Request + List reportsByRequest = _reportsOrderRequestList + .where((elementStatus) => elementStatus.filterName == element.status) + .toList(); + + if (reportsByRequest.length != 0) { + _reportsOrderRequestList[ + _reportsOrderRequestList.indexOf(reportsByRequest[0])] + .reportsList + .add(element); + } else { + _reportsOrderRequestList.add(ReportsList( + filterName: element.clinicDescription, reports: element)); + } + //////// + /// ReportsList list sort Ready + List reportsByReady = _reportsOrderReadyList + .where((elementStatus) => elementStatus.filterName == element.status) + .toList(); + + if (reportsByReady.length != 0) { + _reportsOrderReadyList[ + _reportsOrderReadyList.indexOf(reportsByReady[0])] + .reportsList + .add(element); + } else { + _reportsOrderReadyList.add(ReportsList( + filterName: element.clinicDescription, reports: element)); + } + + /// ReportsList list sort Compleated + List reportsByCompleated = _reportsOrderCompletedList + .where((elementStatus) => elementStatus.filterName == element.status) + .toList(); + + if (reportsByCompleated.length != 0) { + _reportsOrderCompletedList[ + _reportsOrderCompletedList.indexOf(reportsByCompleated[0])] + .reportsList + .add(element); + } else { + _reportsOrderCompletedList.add(ReportsList( + filterName: element.clinicDescription, reports: element)); + } + /// ReportsList list sort Cancelled + List reportsByCancelled = _reportsOrderCanceledList + .where((elementStatus) => elementStatus.filterName == element.status) + .toList(); + + if (reportsByCancelled.length != 0) { + _reportsOrderCanceledList[ + _reportsOrderCanceledList.indexOf(reportsByCompleated[0])] + .reportsList + .add(element); + } else { + _reportsOrderCanceledList.add(ReportsList( + filterName: element.clinicDescription, reports: element)); + } + //**************************** + }); + + } +/////////////////////// + +} diff --git a/lib/locator.dart b/lib/locator.dart index c1a2a170..2e48655e 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -1,11 +1,14 @@ + import 'package:get_it/get_it.dart'; import 'core/service/hospital_service.dart'; import 'core/service/medical/my_doctor_service.dart'; import 'core/service/medical/prescriptions_service.dart'; +import 'core/service/medical/reports_service.dart'; import 'core/viewModels/hospital_view_model.dart'; import 'core/viewModels/medical/my_doctor_view_model.dart'; import 'core/viewModels/medical/prescriptions_view_model.dart'; +import 'core/viewModels/medical/reports_view_model.dart'; import 'core/viewModels/pharmacies_view_model.dart'; import 'core/service/pharmacies_service.dart'; @@ -18,10 +21,12 @@ void setupLocator() { locator.registerLazySingleton(() => PharmacyService()); locator.registerLazySingleton(() => MyDoctorService()); locator.registerLazySingleton(() => PrescriptionsService()); + locator.registerLazySingleton(() => ReportsService()); /// View Model locator.registerFactory(() => HospitalViewModel()); locator.registerFactory(() => PharmacyViewModel()); locator.registerFactory(() => MyDoctorViewModel()); locator.registerFactory(() => PrescriptionsViewModel()); + locator.registerFactory(() => ReportsViewModel()); } diff --git a/lib/pages/medical/medical_profile_page.dart b/lib/pages/medical/medical_profile_page.dart index ceacaed4..b6a0662a 100644 --- a/lib/pages/medical/medical_profile_page.dart +++ b/lib/pages/medical/medical_profile_page.dart @@ -1,6 +1,7 @@ import 'dart:math'; import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescriptions_home_page.dart'; +import 'package:diplomaticquarterapp/pages/medical/reports/report_home_page.dart'; import 'package:diplomaticquarterapp/widgets/data_display/medical/medical_profile_item.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/others/sliver_app_bar_delegate.dart'; @@ -122,11 +123,18 @@ class _MedicalProfilePageState extends State { children: [ Expanded( flex: 1, + child:InkWell( + onTap: (){ + Navigator.push(context, FadePage(page: HomeRepoertsPage())); + + }, + child: MedicalProfileItem( title: 'Medical', imagePath: 'medical_history_icon.png', subTitle: 'Reports', ), + ), ), Expanded( flex: 1, diff --git a/lib/pages/medical/reports/report_home_page.dart b/lib/pages/medical/reports/report_home_page.dart new file mode 100644 index 00000000..10f75b67 --- /dev/null +++ b/lib/pages/medical/reports/report_home_page.dart @@ -0,0 +1,142 @@ +import 'dart:ui'; + +import 'package:diplomaticquarterapp/core/viewModels/medical/prescriptions_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/medical/reports_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescriptions_history.dart'; +import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescriptions_page.dart'; + +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class HomeRepoertsPage extends StatefulWidget { + @override + _HomeRepoertsPageState createState() => _HomeRepoertsPageState(); +} + +class _HomeRepoertsPageState extends State + with SingleTickerProviderStateMixin { + TabController _tabController; + + @override + void initState() { + super.initState(); + _tabController = TabController(length: 4, vsync: this); + } + + @override + void dispose() { + super.dispose(); + _tabController.dispose(); + } + + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) =>model.getReports(), //model.getPrescriptions(), + builder: (_, model, widget) => AppScaffold( + isShowAppBar: true, + appBarTitle: 'Request', + //bottomSheet: Container(), + body: Scaffold( + extendBodyBehindAppBar: true, + appBar: PreferredSize( + preferredSize: Size.fromHeight(65.0), + child: Stack( + children: [ + Positioned( + bottom: 1, + left: 0, + right: 0, + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 10, sigmaY: 10), + child: Container( + color: Theme.of(context) + .scaffoldBackgroundColor + .withOpacity(0.8), + height: 70.0, + ), + ), + ), + Center( + child: Container( + height: 60.0, + margin: EdgeInsets.only(top: 10.0), + width: MediaQuery.of(context).size.width * 0.9, + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + color: Theme.of(context).dividerColor, + width: 0.7), + ), + color: Colors.white), + child: Center( + child: TabBar( + isScrollable: true, + controller: _tabController, + indicatorWeight: 5.0, + indicatorSize: TabBarIndicatorSize.label, + indicatorColor: Colors.red[800], + labelColor: Theme.of(context).primaryColor, + labelPadding: + EdgeInsets.only(top: 4.0, left: 18.0, right: 18.0), + unselectedLabelColor: Colors.grey[800], + tabs: [ + Container( + width: MediaQuery.of(context).size.width * 0.30, + child: Center( + child: Texts('Requested'), + ), + ), + Container( + width: MediaQuery.of(context).size.width * 0.30, + child: Center( + child: Texts('Ready'), + ), + ), + Container( + width: MediaQuery.of(context).size.width * 0.30, + child: Center( + child: Texts('Completed'), + ), + ), + Container( + width: MediaQuery.of(context).size.width * 0.30, + child: Center( + child: Texts('Cancelled'), + ), + ), + ], + ), + ), + ), + ), + ], + ), + ), + body: Column( + children: [ + Expanded( + child: TabBarView( + physics: BouncingScrollPhysics(), + controller: _tabController, + children: [ +// PrescriptionsPage(prescriptionsViewModel: model,), +// PrescriptionsHistory() + Icon(Icons.directions_car), + Icon(Icons.directions_transit), + Icon(Icons.directions_bike), + Icon(Icons.directions_bike), + ], + ), + ) + ], + ), + ), + ), + ); + } +} diff --git a/lib/pages/medical/reports/reports_page.dart b/lib/pages/medical/reports/reports_page.dart new file mode 100644 index 00000000..bb89a9df --- /dev/null +++ b/lib/pages/medical/reports/reports_page.dart @@ -0,0 +1,10 @@ +import 'package:diplomaticquarterapp/core/enum/filter_type.dart'; +import 'package:diplomaticquarterapp/core/viewModels/medical/prescriptions_view_model.dart'; +import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescription_items_page.dart'; +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/medical/doctor_card.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_expandable_notifier.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; \ No newline at end of file