Merge branch 'development_v3.3' into Dev_3.3_InPatient_CR

# Conflicts:
#	lib/config/config.dart
#	lib/config/localized_values.dart
#	lib/core/service/client/base_app_client.dart
#	lib/pages/insurance/AttachInsuranceCardImageDialog.dart
#	lib/uitl/translations_delegate_base.dart
Dev_3.3_InPatient_CR
haroon amjad 1 year ago
commit 72ee34f9a7

@ -19,8 +19,8 @@ var PACKAGES_SHOPPING_CART = '/api/shopping_cart_items';
var PACKAGES_ORDERS = '/api/orders';
var PACKAGES_ORDER_HISTORY = '/api/orders/items';
var PACKAGES_TAMARA_OPT = '/api/orders/paymentoptions/tamara';
// var BASE_URL = 'http://10.50.100.198:2018/';
var BASE_URL = 'https://uat.hmgwebservices.com/';
// var BASE_URL = 'http://10.50.100.198:2018/';
var BASE_URL = 'https://uat.hmgwebservices.com/';
// var BASE_URL = 'https://hmgwebservices.com/';
// var BASE_URL = 'https://orash.cloudsolutions.com.sa/';
// var BASE_URL = 'https://vidauat.cloudsolutions.com.sa/';
@ -184,6 +184,7 @@ var REPORTS = 'Services/Doctors.svc/REST/GetPatientMedicalReportStatusInfo';
var INSERT_REQUEST_FOR_MEDICAL_REPORT = 'Services/Doctors.svc/REST/InsertRequestForMedicalReport';
var SEND_MEDICAL_REPORT_EMAIL = 'Services/Notifications.svc/REST/SendMedicalReportEmail';
var GET_INPATIENT_ADMISSIONS = 'Services/inps.svc/REST/getAdmissionForMedicalReport';
var GET_MEDICAL_REPORT_PDF = 'Services/inps.svc/REST/getMedicalReportPDF';
///Rate
// var IS_LAST_APPOITMENT_RATED = 'Services/Doctors.svc/REST/IsLastAppoitmentRated';
@ -635,6 +636,9 @@ var GET_MEALS_OF_SCHEDULE_ID = 'Services/MOP.svc/REST/GetMealsOfScheduleID_Mobil
var GET_MEAL_ITEMS_OF_SCHEDULE_ID = 'Services/MOP.svc/REST/GetDefaultItemsOfScheduleID';
var PLACE_MEAL_PLAN_ORDER = 'Services/MOP.svc/REST/UpdateOrMakeNewOrder';
var CHECK_PATIENT_NPHIES_ELIGIBILITY = 'Services/Doctors.svc/REST/checkPatientInsuranceCompanyValidity';
var CONVERT_PATIENT_TO_CASH = 'Services/Doctors.svc/REST/deActivateInsuranceCompany';
class AppGlobal {
static var context;

@ -581,6 +581,7 @@ const Map localizedValues = {
"items": {"en": "item(s)", "ar": "عنصر"},
"checkOut": {"en": "CHECK OUT", "ar": "الدفع"},
"sar": {"en": "SAR", "ar": " ر.س "},
"aed": {"en": "AED", "ar": "درهم"},
"payOnline": {"en": "PAY ONLINE", "ar": "اتمام عملية الدفع "},
"cancelOrder": {"en": "CANCEL ORDER", "ar": "الغاء الطلب "},
"confirmAddress": {"en": "CONFIRM ADDRESS ", "ar": " تأكيد العنوان "},
@ -1931,4 +1932,6 @@ const Map localizedValues = {
"proErrorMessage": {"en": "Dear patient, Our staff is currently out of office, please note that our working hours are from 7:00 AM to 10:00 PM, and we'd love to help you during that time, or you can call <insert number here>", "ar": "عزيزي المريض ، طاقم العمل لدينا خارج المكتب حاليًا ، يرجى ملاحظة أن ساعات العمل لدينا من 7:00 صباحًا إلى 10:00 مساءً ، ويسعدنا مساعدتك خلال هذا الوقت ، أو يمكنك الاتصال بـ <أدخل الرقم هنا>"},
"admissionNo": {"en": "Admission No", "ar": "رقم القبول:"},
"admissionReqNo": {"en": "Admission Request No", "ar": "رقم طلب القبول:"},
"dischargeDate": {"en": "Discharge Date", "ar": "تاريخ التفريغ"},
"selectAdmissionText": {"en": "Please select one of the admissions from below to view medical reports:", "ar": "يرجى تحديد أحد حالات القبول من الأسفل لعرض التقارير الطبية:"},
};

@ -13,7 +13,7 @@ class HospitalsModel {
String latitude;
String longitude;
dynamic mainProjectID;
dynamic projectOutSA;
bool projectOutSA;
bool usingInDoctorApp;
HospitalsModel(

@ -12,21 +12,23 @@ class InsuranceManualUpdateRequest {
String policyNo;
String schemeClass;
int requestType;
int patientID;
InsuranceManualUpdateRequest(
{this.setupID,
this.patientIdentificationID,
this.projectID,
this.mobileNo,
this.activityId,
this.component,
this.enableLogging,
this.insuranceCompanyName,
this.cardHolderName,
this.memberShipNo,
this.policyNo,
this.schemeClass,
this.requestType});
this.patientIdentificationID,
this.projectID,
this.mobileNo,
this.activityId,
this.component,
this.enableLogging,
this.insuranceCompanyName,
this.cardHolderName,
this.memberShipNo,
this.policyNo,
this.schemeClass,
this.requestType,
this.patientID});
InsuranceManualUpdateRequest.fromJson(Map<String, dynamic> json) {
setupID = json['SetupID'];
@ -42,6 +44,7 @@ class InsuranceManualUpdateRequest {
policyNo = json['PolicyNo'];
schemeClass = json['SchemeClass'];
requestType = json['RequestType'];
patientID = json['PatientID'];
}
Map<String, dynamic> toJson() {
@ -59,6 +62,7 @@ class InsuranceManualUpdateRequest {
data['PolicyNo'] = this.policyNo;
data['SchemeClass'] = this.schemeClass;
data['RequestType'] = this.requestType;
data['PatientID'] = this.patientID;
return data;
}
}

@ -0,0 +1,228 @@
class AdmissionMedicalReport {
int rowID;
String setupID;
int projectID;
int admissionNo;
String admissionDate;
int admissionRequestNo;
int admissionType;
int patientType;
int patientID;
int clinicID;
int doctorID;
int admittingClinicID;
int admittingDoctorID;
int categoryID;
String roomID;
String bedID;
String dischargeDate;
int approvalNo;
dynamic relativeID;
String registrationDate;
String firstName;
String middleName;
String lastName;
String firstNameN;
String middleNameN;
String lastNameN;
int patientCategory;
int gender;
String dateofBirth;
String dateofBirthN;
String nationalityID;
String firstVisit;
String lastVisit;
int noOfVisit;
String mobileNumber;
String patientIdentificationNo;
int sTATUS;
int admissionStatus;
int buildingID;
String buildingDescription;
String buildingDescriptionN;
int floorID;
int bedGender;
int tariffType;
dynamic cRSVerificationStatus;
String nursingStationID;
String description;
String clinicName;
String doctorNameObj;
int patientDataVerified;
String projectName;
dynamic projectNameN;
String statusDescription;
String statusDescriptionN;
AdmissionMedicalReport(
{this.rowID,
this.setupID,
this.projectID,
this.admissionNo,
this.admissionDate,
this.admissionRequestNo,
this.admissionType,
this.patientType,
this.patientID,
this.clinicID,
this.doctorID,
this.admittingClinicID,
this.admittingDoctorID,
this.categoryID,
this.roomID,
this.bedID,
this.dischargeDate,
this.approvalNo,
this.relativeID,
this.registrationDate,
this.firstName,
this.middleName,
this.lastName,
this.firstNameN,
this.middleNameN,
this.lastNameN,
this.patientCategory,
this.gender,
this.dateofBirth,
this.dateofBirthN,
this.nationalityID,
this.firstVisit,
this.lastVisit,
this.noOfVisit,
this.mobileNumber,
this.patientIdentificationNo,
this.sTATUS,
this.admissionStatus,
this.buildingID,
this.buildingDescription,
this.buildingDescriptionN,
this.floorID,
this.bedGender,
this.tariffType,
this.cRSVerificationStatus,
this.nursingStationID,
this.description,
this.clinicName,
this.doctorNameObj,
this.patientDataVerified,
this.projectName,
this.projectNameN,
this.statusDescription,
this.statusDescriptionN});
AdmissionMedicalReport.fromJson(Map<String, dynamic> json) {
rowID = json['RowID'];
setupID = json['SetupID'];
projectID = json['ProjectID'];
admissionNo = json['AdmissionNo'];
admissionDate = json['AdmissionDate'];
admissionRequestNo = json['AdmissionRequestNo'];
admissionType = json['AdmissionType'];
patientType = json['PatientType'];
patientID = json['PatientID'];
clinicID = json['ClinicID'];
doctorID = json['DoctorID'];
admittingClinicID = json['AdmittingClinicID'];
admittingDoctorID = json['AdmittingDoctorID'];
categoryID = json['CategoryID'];
roomID = json['RoomID'];
bedID = json['BedID'];
dischargeDate = json['DischargeDate'];
approvalNo = json['ApprovalNo'];
relativeID = json['RelativeID'];
registrationDate = json['RegistrationDate'];
firstName = json['FirstName'];
middleName = json['MiddleName'];
lastName = json['LastName'];
firstNameN = json['FirstNameN'];
middleNameN = json['MiddleNameN'];
lastNameN = json['LastNameN'];
patientCategory = json['PatientCategory'];
gender = json['Gender'];
dateofBirth = json['DateofBirth'];
dateofBirthN = json['DateofBirthN'];
nationalityID = json['NationalityID'];
firstVisit = json['FirstVisit'];
lastVisit = json['LastVisit'];
noOfVisit = json['NoOfVisit'];
mobileNumber = json['MobileNumber'];
patientIdentificationNo = json['PatientIdentificationNo'];
sTATUS = json['STATUS'];
admissionStatus = json['AdmissionStatus'];
buildingID = json['BuildingID'];
buildingDescription = json['BuildingDescription'];
buildingDescriptionN = json['BuildingDescriptionN'];
floorID = json['FloorID'];
bedGender = json['BedGender'];
tariffType = json['TariffType'];
cRSVerificationStatus = json['CRSVerificationStatus'];
nursingStationID = json['NursingStationID'];
description = json['Description'];
clinicName = json['ClinicName'];
doctorNameObj = json['DoctorNameObj'];
patientDataVerified = json['PatientDataVerified'];
projectName = json['ProjectName'];
projectNameN = json['ProjectNameN'];
statusDescription = json['StatusDescription'];
statusDescriptionN = json['StatusDescriptionN'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['RowID'] = this.rowID;
data['SetupID'] = this.setupID;
data['ProjectID'] = this.projectID;
data['AdmissionNo'] = this.admissionNo;
data['AdmissionDate'] = this.admissionDate;
data['AdmissionRequestNo'] = this.admissionRequestNo;
data['AdmissionType'] = this.admissionType;
data['PatientType'] = this.patientType;
data['PatientID'] = this.patientID;
data['ClinicID'] = this.clinicID;
data['DoctorID'] = this.doctorID;
data['AdmittingClinicID'] = this.admittingClinicID;
data['AdmittingDoctorID'] = this.admittingDoctorID;
data['CategoryID'] = this.categoryID;
data['RoomID'] = this.roomID;
data['BedID'] = this.bedID;
data['DischargeDate'] = this.dischargeDate;
data['ApprovalNo'] = this.approvalNo;
data['RelativeID'] = this.relativeID;
data['RegistrationDate'] = this.registrationDate;
data['FirstName'] = this.firstName;
data['MiddleName'] = this.middleName;
data['LastName'] = this.lastName;
data['FirstNameN'] = this.firstNameN;
data['MiddleNameN'] = this.middleNameN;
data['LastNameN'] = this.lastNameN;
data['PatientCategory'] = this.patientCategory;
data['Gender'] = this.gender;
data['DateofBirth'] = this.dateofBirth;
data['DateofBirthN'] = this.dateofBirthN;
data['NationalityID'] = this.nationalityID;
data['FirstVisit'] = this.firstVisit;
data['LastVisit'] = this.lastVisit;
data['NoOfVisit'] = this.noOfVisit;
data['MobileNumber'] = this.mobileNumber;
data['PatientIdentificationNo'] = this.patientIdentificationNo;
data['STATUS'] = this.sTATUS;
data['AdmissionStatus'] = this.admissionStatus;
data['BuildingID'] = this.buildingID;
data['BuildingDescription'] = this.buildingDescription;
data['BuildingDescriptionN'] = this.buildingDescriptionN;
data['FloorID'] = this.floorID;
data['BedGender'] = this.bedGender;
data['TariffType'] = this.tariffType;
data['CRSVerificationStatus'] = this.cRSVerificationStatus;
data['NursingStationID'] = this.nursingStationID;
data['Description'] = this.description;
data['ClinicName'] = this.clinicName;
data['DoctorNameObj'] = this.doctorNameObj;
data['PatientDataVerified'] = this.patientDataVerified;
data['ProjectName'] = this.projectName;
data['ProjectNameN'] = this.projectNameN;
data['StatusDescription'] = this.statusDescription;
data['StatusDescriptionN'] = this.statusDescriptionN;
return data;
}
}

@ -51,12 +51,13 @@ class HospitalService extends BaseService {
}
}
Future getHospitals({bool isResBasedOnLoc = true}) async {
Future getHospitals({bool isResBasedOnLoc = true, bool isAdvancePayment = false}) async {
if (isResBasedOnLoc) await _getCurrentLocation();
Map<String, dynamic> body = Map();
body['Latitude'] = await this.sharedPref.getDouble(USER_LAT);
body['Longitude'] = await this.sharedPref.getDouble(USER_LONG);
body['IsOnlineCheckIn'] = isResBasedOnLoc;
body['IsAdvancePayment'] = isAdvancePayment;
await baseAppClient.post(GET_PROJECT, onSuccess: (dynamic response, int statusCode) {
_hospitals.clear();

@ -1,12 +1,17 @@
import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/core/model/reports/Reports.dart';
import 'package:diplomaticquarterapp/core/model/reports/admission_for_medical_report.dart';
import 'package:diplomaticquarterapp/core/model/reports/request_reports.dart';
import 'package:diplomaticquarterapp/core/service/base_service.dart';
import 'package:diplomaticquarterapp/pages/feedback/appointment_history.dart';
class ReportsService extends BaseService {
List<Reports> reportsList = List();
List<Reports> inpatientReportsList = List();
List<AppointmentHistory> appointHistoryList = List();
List<AdmissionMedicalReport> admissionsMedicalReport = List();
String userAgreementContent = "";
RequestReports _requestReports = RequestReports(isReport: true, encounterType: 1, requestType: 1, patientOutSA: 0, projectID: 0);
@ -23,18 +28,34 @@ class ReportsService extends BaseService {
}, body: _requestReports.toJson());
}
Future getInPatientReports() async {
RequestReports _requestReportsInpatient = RequestReports(isReport: true, encounterType: 2, requestType: 2, patientOutSA: 0, projectID: 0);
hasError = false;
await baseAppClient.post(REPORTS, onSuccess: (dynamic response, int statusCode) {
inpatientReportsList.clear();
response['GetPatientMedicalStatus'].forEach((reports) {
inpatientReportsList.add(Reports.fromJson(reports));
});
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: _requestReportsInpatient.toJson());
}
Future getInpatientAdmissionsList() async {
Map<String, dynamic> body = new Map<String, dynamic>();
body['IsForMedicalReport'] = true;
hasError = false;
await baseAppClient.post(GET_INPATIENT_ADMISSIONS, onSuccess: (dynamic response, int statusCode) {
reportsList.clear();
admissionsMedicalReport.clear();
print(response['AdmissionsForMedicalReport']);
response['AdmissionsForMedicalReport'].forEach((reports) {
// reportsList.add(Reports.fromJson(reports));
admissionsMedicalReport.add(AdmissionMedicalReport.fromJson(reports));
});
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: _requestReports.toJson());
}, body: body);
}
Future getPatentAppointmentHistory() async {
@ -105,6 +126,28 @@ class ReportsService extends BaseService {
}, body: body);
}
Future insertRequestForInPatientMedicalReport(int clinicID, int doctorID, String setupID, int admissionNo, int projectID) async {
Map<String, dynamic> body = new Map<String, dynamic>();
body['ClinicID'] = clinicID;
body['DoctorID'] = doctorID;
body['SetupID'] = setupID;
body['EncounterNo'] = admissionNo;
body['EncounterType'] = 2; // appointmentHistory.appointmentType;
body['IsActive'] = true;
body['ProjectID'] = projectID;
body['Remarks'] = "";
body['ProcedureId'] = "";
body['RequestType'] = 2;
body['Source'] = 2;
body['Status'] = 1;
body['CreatedBy'] = 102;
hasError = false;
await baseAppClient.post(INSERT_REQUEST_FOR_MEDICAL_REPORT, onSuccess: (dynamic response, int statusCode) {}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: body);
}
Future sendEmailForMedicalReport(String projectName, String clinicName, String doctorName, String requestDate, String invoiceNo, int projectID, String stamp, String setupID) async {
Map<String, dynamic> body = new Map<String, dynamic>();
body['SetupID'] = setupID;
@ -134,4 +177,34 @@ class ReportsService extends BaseService {
}, body: body);
return response;
}
Future getMedicalReportPDF(String projectName, String clinicName, String doctorName, String requestDate, String invoiceNo, int projectID, String stamp, String setupID) async {
Map<String, dynamic> body = new Map<String, dynamic>();
body['SetupID'] = setupID;
body['PrintDate'] = requestDate;
body['ProcedureID'] = "05005009";
body['Reporttype'] = "MEDICAL REPORT";
body['stamp'] = stamp;
body['To'] = user.emailAddress;
body['DateofBirth'] = user.dateofBirth;
body['PatientIditificationNum'] = user.patientIdentificationNo;
body['PatientMobileNumber'] = user.mobileNumber;
body['PatientName'] = user.firstName + " " + user.lastName;
body['ProjectName'] = projectName;
body['ClinicName'] = clinicName;
body['ProjectID'] = projectID;
body['InvoiceNo'] = invoiceNo;
body['PrintedByName'] = user.firstName + " " + user.lastName;
dynamic response;
hasError = false;
await baseAppClient.post(GET_MEDICAL_REPORT_PDF, onSuccess: (dynamic res, int statusCode) {
response = res;
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: body);
return response;
}
}

@ -70,9 +70,9 @@ class MyBalanceViewModel extends BaseViewModel {
}
}
Future getHospitals() async {
Future getHospitals({bool isAdvancePayment = false}) async {
setState(ViewState.Busy);
await _hospitalService.getHospitals();
await _hospitalService.getHospitals(isAdvancePayment: isAdvancePayment);
if (_hospitalService.hasError) {
error = _hospitalService.error;
setState(ViewState.Error);

@ -1,3 +1,4 @@
import 'package:diplomaticquarterapp/core/model/reports/admission_for_medical_report.dart';
import 'package:diplomaticquarterapp/pages/feedback/appointment_history.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
@ -15,17 +16,20 @@ class ReportsViewModel extends BaseViewModel {
List<Reports> reportsOrderRequestList = List();
List<Reports> reportsOrderReadyList = List();
List<Reports> reportsOrderCompletedList = List();
List<Reports> reportsOrderCanceledList = List();
List<AppointmentHistory> get appointHistoryList =>
_reportsService.appointHistoryList;
List<Reports> reportsInPatientOrderRequestList = List();
List<Reports> reportsInPatientOrderReadyList = List();
List<Reports> reportsInPatientOrderCanceledList = List();
List<AppointmentHistory> get appointHistoryList => _reportsService.appointHistoryList;
List<AdmissionMedicalReport> get admissionsMedicalReportList => _reportsService.admissionsMedicalReport;
getReports() async {
setState(ViewState.Busy);
reportsOrderRequestList.clear();
reportsOrderReadyList.clear();
reportsOrderCompletedList.clear();
reportsOrderCanceledList.clear();
await _reportsService.getReports();
if (_reportsService.hasError) {
@ -38,6 +42,21 @@ class ReportsViewModel extends BaseViewModel {
}
}
getInPatientReports() async {
setState(ViewState.Busy);
reportsInPatientOrderRequestList.clear();
reportsInPatientOrderReadyList.clear();
reportsInPatientOrderCanceledList.clear();
await _reportsService.getInPatientReports();
if (_reportsService.hasError) {
error = _reportsService.error;
setState(ViewState.Error);
} else {
_filterInPatientList();
setState(ViewState.Idle);
}
}
getPatentAppointmentHistory() async {
setState(ViewState.Busy);
await _reportsService.getPatentAppointmentHistory();
@ -49,6 +68,23 @@ class ReportsViewModel extends BaseViewModel {
}
}
void _filterInPatientList() {
_reportsService.inpatientReportsList.forEach((report) {
switch (report.status) {
case 1:
reportsInPatientOrderRequestList.add(report);
break;
case 2:
reportsInPatientOrderReadyList.add(report);
break;
case 4:
reportsInPatientOrderCanceledList.add(report);
break;
default:
}
});
}
void _filterList() {
_reportsService.reportsList.forEach((report) {
switch (report.status) {
@ -58,9 +94,6 @@ class ReportsViewModel extends BaseViewModel {
case 2:
reportsOrderReadyList.add(report);
break;
case 3:
reportsOrderCompletedList.add(report);
break;
case 4:
reportsOrderCanceledList.add(report);
break;
@ -69,17 +102,31 @@ class ReportsViewModel extends BaseViewModel {
});
}
insertRequestForMedicalReport(AppointmentHistory appointmentHistory, String mes) async {
setState(ViewState.Busy);
await _reportsService.insertRequestForMedicalReport(appointmentHistory);
if (_reportsService.hasError) {
error = _reportsService.error;
AppToast.showErrorToast(message: error);
setState(ViewState.ErrorLocal);
} else {
AppToast.showSuccessToast(message: mes);
getInPatientReports();
setState(ViewState.Idle);
}
}
insertRequestForMedicalReport(AppointmentHistory appointmentHistory,String mes)async{
setState(ViewState.Busy);
await _reportsService.insertRequestForMedicalReport(appointmentHistory);
if (_reportsService.hasError) {
error = _reportsService.error;
AppToast.showErrorToast(message: error);
setState(ViewState.ErrorLocal);
} else {
AppToast.showSuccessToast(message: mes);
setState(ViewState.Idle);
}
insertRequestForInPatientMedicalReport(int clinicID, int doctorID, String setupID, int admissionNo, int projectID, String mes) async {
setState(ViewState.Busy);
await _reportsService.insertRequestForInPatientMedicalReport(clinicID, doctorID, setupID, admissionNo, projectID);
if (_reportsService.hasError) {
error = _reportsService.error;
AppToast.showErrorToast(message: error);
setState(ViewState.ErrorLocal);
} else {
AppToast.showSuccessToast(message: mes);
setState(ViewState.Idle);
}
}
}

@ -57,6 +57,16 @@ class _AnicllaryOrdersState extends State<AnicllaryOrdersDetails> with SingleTic
super.dispose();
}
void getAncillaryOrderDetails(AnciallryOrdersViewModel model) {
GifLoaderDialogUtils.showMyDialog(context);
model.getOrdersDetails(widget.appoNo, widget.orderNo, widget.projectID).then((value) {
addToSelectedProcedures(model);
GifLoaderDialogUtils.hideDialog(context);
}).catchError((err) {
GifLoaderDialogUtils.hideDialog(context);
});
}
@override
Widget build(BuildContext context) {
projectViewModel = Provider.of(context);
@ -64,6 +74,7 @@ class _AnicllaryOrdersState extends State<AnicllaryOrdersDetails> with SingleTic
AppGlobal.context = context;
return BaseView<AnciallryOrdersViewModel>(
onModelReady: (model) {
// getAncillaryOrderDetails(model);
model.getOrdersDetails(widget.appoNo, widget.orderNo, widget.projectID).then((value) {
addToSelectedProcedures(model);
});

@ -84,7 +84,7 @@ class ConfirmPaymentPage extends StatelessWidget {
child: selectedPaymentMethod == "ApplePay" ? SvgPicture.asset(getImagePath(selectedPaymentMethod)) : Image.asset(getImagePath(selectedPaymentMethod)),
),
Texts(
'${advanceModel.amount} SAR',
advanceModel.hospitalsModel.projectOutSA ? '${advanceModel.amount} AED' : '${advanceModel.amount} SAR',
fontSize: 26,
bold: true,
)

@ -7,6 +7,9 @@ import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart
import 'package:diplomaticquarterapp/models/Appointments/PatientShareResposne.dart';
import 'package:diplomaticquarterapp/models/Appointments/toDoCountProviderModel.dart';
import 'package:diplomaticquarterapp/models/header_model.dart';
import 'package:diplomaticquarterapp/pages/insurance/UpdateInsuranceManually.dart';
import 'package:diplomaticquarterapp/pages/insurance/insurance_update_screen.dart';
import 'package:diplomaticquarterapp/pages/landing/landing_page.dart';
import 'package:diplomaticquarterapp/routes.dart';
import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart';
import 'package:diplomaticquarterapp/services/clinic_services/get_clinic_service.dart';
@ -271,7 +274,51 @@ class _BookConfirmState extends State<BookConfirm> {
});
}
insertAppointment(context, DoctorList docObject, int initialSlotDuration) async{
checkPatientNphiesEligibility(DoctorList docObject, String appointmentNo, BuildContext context) {
widget.service.checkPatientNphiesEligibility(docObject.projectID).then((res) {
GifLoaderDialogUtils.hideDialog(context);
if (res["isNphiesMatchedWithVida"]) {
getPatientShare(context, appointmentNo, docObject.clinicID, docObject.projectID, docObject);
getToDoCount();
} else {
ConfirmDialog dialog = new ConfirmDialog(
isDissmissable: false,
context: context,
confirmMessage: res['ErrorEndUserMessage'],
okText: "Update insurance",
cancelText: "Continue as cash",
okFunction: () => {openUpdateInsurance()},
cancelFunction: () => {continueAsCash(docObject, appointmentNo)});
dialog.showAlertDialog(context);
}
}).catchError((err) {
GifLoaderDialogUtils.hideDialog(context);
print(err);
});
}
void openUpdateInsurance() {
Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (context) => LandingPage()), (Route<dynamic> r) => false);
Navigator.push(context, FadePage(page: InsuranceUpdate()));
}
void continueAsCash(DoctorList docObject, String appointmentNo) {
GifLoaderDialogUtils.showMyDialog(context);
widget.service.convertPatientToCash(docObject.projectID).then((res) {
GifLoaderDialogUtils.hideDialog(context);
if (res["MessageStatus"] == 1) {
getPatientShare(context, appointmentNo, docObject.clinicID, docObject.projectID, docObject);
getToDoCount();
} else {
AppToast.showErrorToast(message: res["ErrorEndUserMessage"]);
}
}).catchError((err) {
GifLoaderDialogUtils.hideDialog(context);
print(err);
});
}
insertAppointment(context, DoctorList docObject, int initialSlotDuration) async {
final timeSlot = DocAvailableAppointments.selectedAppoDateTime;
String logs = await sharedPref.getString('selectedLogSlots');
List<dynamic> decodedLogs = json.decode(logs);
@ -284,14 +331,15 @@ class _BookConfirmState extends State<BookConfirm> {
AppToast.showSuccessToast(message: TranslationBase.of(context).bookedSuccess);
Future.delayed(new Duration(milliseconds: 500), () {
getPatientShare(context, res['AppointmentNo'], docObject.clinicID, docObject.projectID, docObject);
// checkPatientNphiesEligibility(docObject, res['AppointmentNo'], context);
getToDoCount();
getPatientShare(context, res['AppointmentNo'], docObject.clinicID, docObject.projectID, docObject);
});
widget.service.logDoctorFreeSlots(docObject.doctorID, docObject.clinicID, docObject.projectID, decodedLogs,res['AppointmentNo'], context).then((res) {
widget.service.logDoctorFreeSlots(docObject.doctorID, docObject.clinicID, docObject.projectID, decodedLogs, res['AppointmentNo'], context).then((res) {
if (res['MessageStatus'] == 1) {
print("Logs Saved");
}else{
} else {
print("Error Saving logs");
}
});
@ -389,6 +437,7 @@ class _BookConfirmState extends State<BookConfirm> {
}
getPatientShare(context, String appointmentNo, int clinicID, int projectID, DoctorList docObject) {
GifLoaderDialogUtils.showMyDialog(context);
widget.service.getPatientShare(appointmentNo, clinicID, projectID, context).then((res) {
projectViewModel.selectedBodyPartList.clear();
projectViewModel.laserSelectionDuration = 0;

@ -1,5 +1,6 @@
import 'dart:collection';
import 'package:diplomaticquarterapp/core/model/hospitals/hospitals_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart';
import 'package:diplomaticquarterapp/models/Appointments/laser_body_parts.dart';
@ -17,7 +18,9 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class LaserClinic extends StatefulWidget {
LaserClinic({Key key}) : super(key: key);
HospitalsModel selectedHospital;
LaserClinic({this.selectedHospital});
@override
_LaserClinicState createState() {
@ -66,7 +69,7 @@ class _LaserClinicState extends State<LaserClinic> with SingleTickerProviderStat
GifLoaderDialogUtils.showMyDialog(context);
DoctorsListService service = new DoctorsListService();
service.getLaserBodyPartsList(laserCategoryId).then((res) {
service.getLaserBodyPartsList(laserCategoryId, widget.selectedHospital.iD).then((res) {
GifLoaderDialogUtils.hideDialog(context);
if (res['MessageStatus'] == 1) {
if (res['Laser_GetBodyPartsByCategoryList'].length != 0) {

@ -240,11 +240,10 @@ class _SearchByClinicState extends State<SearchByClinic> {
dropdownValue =
clincs.clinicID.toString() + "-" + clincs.isLiveCareClinicAndOnline.toString() + "-" + clincs.liveCareClinicID.toString() + "-" + clincs.liveCareServiceID.toString();
if (dropdownValue == "253-false-0-0") {
Navigator.push(context, FadePage(page: LaserClinic()));
// Navigator.push(context, FadePage(page: LaserClinic()));
} else if (!isDentalSelectedAndSupported()) {
projectDropdownValue = "";
if(!nearestAppo)
getDoctorsList(context);
if (!nearestAppo) getDoctorsList(context);
} else {}
});
projectViewModel.analytics.appointment.book_appointment_select_clinic(appointment_type: 'regular', clinic: clincs.clinicDescription);
@ -333,7 +332,11 @@ class _SearchByClinicState extends State<SearchByClinic> {
setState(() {
selectedHospital = newValue;
projectDropdownValue = newValue.mainProjectID.toString();
getDoctorsList(context);
if (dropdownValue.split("-")[0] == "253") {
Navigator.push(context, FadePage(page: LaserClinic(selectedHospital: selectedHospital)));
} else {
getDoctorsList(context);
}
});
},
),
@ -458,7 +461,7 @@ class _SearchByClinicState extends State<SearchByClinic> {
bool isDentalSelectedAndSupported() {
if (dropdownValue != null)
return dropdownValue != "" && (dropdownValue.split("-")[0] == "17") && isMobileAppDentalAllow;
return dropdownValue != "" && (dropdownValue.split("-")[0] == "17" || dropdownValue.split("-")[0] == "253") && isMobileAppDentalAllow;
else
return false;
}
@ -531,8 +534,8 @@ class _SearchByClinicState extends State<SearchByClinic> {
searchInfo.clinic = selectedClinic;
searchInfo.date = DateTime.now();
if(projectViewModel.isLogin) {
if(projectViewModel.user.age > 12) {
if (projectViewModel.isLogin) {
if (projectViewModel.user.age > 12) {
navigateToDentalComplaints(context, searchInfo);
} else {
callDoctorsSearchAPI(17);

@ -72,7 +72,8 @@ class _AppointmentActionsState extends State<AppointmentActions> {
padding: EdgeInsets.all(21),
shrinkWrap: true,
itemBuilder: (context, index) {
bool shouldEnable = ((widget.appo.clinicID == 17 || widget.appo.clinicID == 47) && appoButtonsList[index].caller == "openReschedule");
// bool shouldEnable = ((widget.appo.clinicID == 17 || widget.appo.clinicID == 47) || (widget.appo.isLiveCareAppointment && appoButtonsList[index].caller == "askDoc") || appoButtonsList[index].caller == "openReschedule");
bool shouldEnable = (((widget.appo.clinicID == 17 || widget.appo.clinicID == 47) && appoButtonsList[index].caller == "openReschedule") || (widget.appo.isLiveCareAppointment && appoButtonsList[index].caller == "askDoc"));
return InkWell(
onTap: shouldEnable
? null

@ -17,6 +17,8 @@ import 'package:diplomaticquarterapp/pages/BookAppointment/SearchResults.dart';
import 'package:diplomaticquarterapp/pages/MyAppointments/AppointmentDetails.dart';
import 'package:diplomaticquarterapp/pages/ToDoList/payment_method_select.dart';
import 'package:diplomaticquarterapp/pages/ToDoList/widgets/paymentDialog.dart';
import 'package:diplomaticquarterapp/pages/insurance/insurance_update_screen.dart';
import 'package:diplomaticquarterapp/pages/landing/landing_page.dart';
import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
@ -28,6 +30,7 @@ import 'package:diplomaticquarterapp/uitl/utils.dart';
import 'package:diplomaticquarterapp/uitl/utils_new.dart';
import 'package:diplomaticquarterapp/widgets/avatar/large_avatar.dart';
import 'package:diplomaticquarterapp/widgets/data_display/medical/doctor_card.dart';
import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart';
import 'package:diplomaticquarterapp/widgets/in_app_browser/InAppBrowser.dart';
import 'package:diplomaticquarterapp/widgets/my_rich_text.dart';
import 'package:diplomaticquarterapp/widgets/others/app_expandable_notifier.dart';
@ -541,6 +544,7 @@ class _ToDoState extends State<ToDo> with SingleTickerProviderStateMixin {
break;
case 20:
getPatientShare(context, appo);
// checkPatientNphiesEligibility(context, appo);
break;
case 30:
getAppoQR(context, appo);
@ -837,6 +841,53 @@ class _ToDoState extends State<ToDo> with SingleTickerProviderStateMixin {
// getAncillaryOrders();
}
checkPatientNphiesEligibility(context, AppoitmentAllHistoryResultList appo) {
DoctorsListService service = new DoctorsListService();
GifLoaderDialogUtils.showMyDialog(context);
service.checkPatientNphiesEligibility(appo.projectID).then((res) {
GifLoaderDialogUtils.hideDialog(context);
if (res["isNphiesMatchedWithVida"]) {
getPatientShare(context, appo);
// getToDoCount();
} else {
ConfirmDialog dialog = new ConfirmDialog(
isDissmissable: false,
context: context,
confirmMessage: res['ErrorEndUserMessage'],
okText: "Update insurance",
cancelText: "Continue as cash",
okFunction: () => {openUpdateInsurance()},
cancelFunction: () => {continueAsCash(appo)});
dialog.showAlertDialog(context);
}
}).catchError((err) {
GifLoaderDialogUtils.hideDialog(context);
print(err);
});
}
void openUpdateInsurance() {
Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (context) => LandingPage()), (Route<dynamic> r) => false);
Navigator.push(context, FadePage(page: InsuranceUpdate()));
}
void continueAsCash(AppoitmentAllHistoryResultList appo) {
DoctorsListService service = new DoctorsListService();
GifLoaderDialogUtils.showMyDialog(context);
service.convertPatientToCash(appo.projectID).then((res) {
GifLoaderDialogUtils.hideDialog(context);
if (res["MessageStatus"] == 1) {
getPatientShare(context, appo);
// getToDoCount();
} else {
AppToast.showErrorToast(message: res["ErrorEndUserMessage"]);
}
}).catchError((err) {
GifLoaderDialogUtils.hideDialog(context);
print(err);
});
}
getPatientShare(context, AppoitmentAllHistoryResultList appo) {
DoctorsListService service = new DoctorsListService();
if (appo.isLiveCareAppointment) {
@ -1119,7 +1170,7 @@ class _ToDoState extends State<ToDo> with SingleTickerProviderStateMixin {
error_type: res['Response_Message']);
}
}).catchError((err) {
if(mounted) GifLoaderDialogUtils.hideDialog(context);
if (mounted) GifLoaderDialogUtils.hideDialog(context);
print(err);
});
}

@ -13,10 +13,12 @@ import 'package:flutter/material.dart';
class AttachInsuranceCardImageDialog extends StatefulWidget {
final String name;
final String fileNo;
final String identificationNo;
final String mobileNo;
final Function(File file, String image) image;
final bool isBirthNotification;
const AttachInsuranceCardImageDialog({Key key, this.name, this.fileNo, this.image, this.isBirthNotification = false}) : super(key: key);
const AttachInsuranceCardImageDialog({Key key, this.name, this.fileNo, this.identificationNo, this.mobileNo, this.image, this.isBirthNotification = false}) : super(key: key);
@override
_AttachInsuranceCardImageDialogState createState() => _AttachInsuranceCardImageDialogState();
@ -143,6 +145,35 @@ class _AttachInsuranceCardImageDialogState extends State<AttachInsuranceCardImag
color: CustomColors.accentColor,
),
),
Text(
"OR",
style: TextStyle(
fontSize: 16,
letterSpacing: -0.48,
fontWeight: FontWeight.w600,
),
),
Padding(
padding: const EdgeInsets.all(18.0),
child: DefaultButton(
TranslationBase.of(context).updateInsuranceManually,
() {
Navigator.pop(context);
Navigator.push(
context,
FadePage(
page: UpdateInsuranceManually(
patientIdentificationNo: widget.identificationNo,
patientMobileNumber: widget.mobileNo,
patientID: num.parse(widget.fileNo),
),
),
);
},
textColor: Colors.white,
color: CustomColors.accentColor,
),
),
SizedBox(
height: 25.0,
),

@ -16,7 +16,11 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class UpdateInsuranceManually extends StatefulWidget {
const UpdateInsuranceManually({Key key}) : super(key: key);
String patientIdentificationNo;
String patientMobileNumber;
int patientID;
UpdateInsuranceManually({@required this.patientIdentificationNo, @required this.patientMobileNumber, @required this.patientID});
@override
State<UpdateInsuranceManually> createState() => _UpdateInsuranceManuallyState();
@ -51,7 +55,7 @@ class _UpdateInsuranceManuallyState extends State<UpdateInsuranceManually> {
@override
Widget build(BuildContext context) {
projectViewModel = Provider.of(context);
_nationalIDTextController.text = projectViewModel.user.patientIdentificationNo;
_nationalIDTextController.text = widget.patientIdentificationNo;
return AppScaffold(
isShowAppBar: true,
isShowDecPage: false,
@ -160,7 +164,7 @@ class _UpdateInsuranceManuallyState extends State<UpdateInsuranceManually> {
child: DefaultButton(
TranslationBase.of(context).submit,
() {
if(isFormValid())
if (isFormValid())
submitManualInsuranceUpdateRequest();
else
AppToast.showErrorToast(message: TranslationBase.of(context).enterInsuranceDetails);
@ -193,6 +197,7 @@ class _UpdateInsuranceManuallyState extends State<UpdateInsuranceManually> {
listData: list,
selectedIndex: _selectedInsuranceCompanyIndex,
isScrollable: true,
isShowSearch: true,
onValueSelected: (index) {
_selectedInsuranceCompanyIndex = index;
selectedInsuranceCompanyObj = insuranceCompaniesList[index];
@ -239,16 +244,18 @@ class _UpdateInsuranceManuallyState extends State<UpdateInsuranceManually> {
insuranceManualUpdateRequest.projectID = selectedInsuranceCompanyObj.projectID;
insuranceManualUpdateRequest.requestType = 2;
insuranceManualUpdateRequest.mobileNo = projectViewModel.user.mobileNumber;
insuranceManualUpdateRequest.mobileNo = widget.patientMobileNumber;
insuranceManualUpdateRequest.cardHolderName = _cardHolderNameTextController.text;
insuranceManualUpdateRequest.insuranceCompanyName = selectedInsuranceCompanyObj.companyName;
insuranceManualUpdateRequest.memberShipNo = _membershipNoTextController.text;
insuranceManualUpdateRequest.policyNo = _policyNoTextController.text;
insuranceManualUpdateRequest.patientIdentificationID = projectViewModel.user.patientIdentificationNo;
insuranceManualUpdateRequest.patientIdentificationID = widget.patientIdentificationNo;
insuranceManualUpdateRequest.schemeClass = selectedInsuranceCompaniesSchemesObj.subCategoryDesc;
insuranceManualUpdateRequest.setupID = selectedInsuranceCompanyObj.setupID;
insuranceManualUpdateRequest.patientID = widget.patientID;
_insuranceCardService.submitManualInsuranceUpdateRequest(insuranceManualUpdateRequest).then((value) {
print(value);
AppToast.showSuccessToast(message: TranslationBase.of(context).insuranceRequestSubmit);
Navigator.pop(context);
GifLoaderDialogUtils.hideDialog(context);

@ -9,6 +9,7 @@ import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/uitl/utils_new.dart';
import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart';
import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
@ -53,10 +54,7 @@ class _InsuranceCardState extends State<InsuranceCard> {
Navigator.push(context, FadePage(page: InsuranceUpdate()));
},
backgroundColor: CustomColors.accentColor,
label: Text(TranslationBase.of(context).update, style: TextStyle(
fontSize: 12.0,
fontWeight: FontWeight.bold
)),
label: Text(TranslationBase.of(context).update, style: TextStyle(fontSize: 12.0, fontWeight: FontWeight.bold)),
),
body: Container(
child: ListView.separated(
@ -176,12 +174,11 @@ class _InsuranceCardState extends State<InsuranceCard> {
if (model.insurance[index].isActive == true)
Container(
color: Colors.transparent,
child: SecondaryButton(
onTap: () => {
child: DefaultButton(
TranslationBase.of(context).seeDetails,
() => {
getDetails(model.insurance[index]),
},
label: TranslationBase.of(context).seeDetails,
textColor: Colors.white,
),
width: double.infinity,
),

@ -22,8 +22,9 @@ class InsuranceCardUpdateDetails extends StatelessWidget {
final String patientIdentificationID;
final int patientID;
final String name;
final String mobileNo;
const InsuranceCardUpdateDetails({Key key, this.insuranceCardDetailsModel, this.patientIdentificationID, this.patientID, this.name}) : super(key: key);
const InsuranceCardUpdateDetails({Key key, this.insuranceCardDetailsModel, this.patientIdentificationID, this.patientID, this.name, this.mobileNo}) : super(key: key);
@override
Widget build(BuildContext context) {
@ -304,7 +305,8 @@ class InsuranceCardUpdateDetails extends StatelessWidget {
color: CustomColors.accentColor,
small: true,
onTap: () async {
confirmAttachInsuranceCardImageDialogDialog(context: context, name: name, fileNo: patientID.toString(), model: model);
confirmAttachInsuranceCardImageDialogDialog(
context: context, name: name, fileNo: patientID.toString(), identificationNo: patientIdentificationID, mobileNo: mobileNo, model: model);
},
),
if (insuranceCardDetailsModel.isNotEmpty)
@ -334,7 +336,8 @@ class InsuranceCardUpdateDetails extends StatelessWidget {
label: TranslationBase.of(context).disagree.toUpperCase(),
color: Colors.grey[800],
onTap: () async {
confirmAttachInsuranceCardImageDialogDialog(context: context, name: name, fileNo: patientID.toString(), model: model);
confirmAttachInsuranceCardImageDialogDialog(
context: context, name: name, fileNo: patientID.toString(), identificationNo: patientIdentificationID, mobileNo: mobileNo, model: model);
},
)
],
@ -346,12 +349,14 @@ class InsuranceCardUpdateDetails extends StatelessWidget {
);
}
void confirmAttachInsuranceCardImageDialogDialog({BuildContext context, String name, String fileNo, InsuranceViewModel model}) {
void confirmAttachInsuranceCardImageDialogDialog({BuildContext context, String name, String fileNo, String identificationNo, String mobileNo, InsuranceViewModel model}) {
showDialog(
context: context,
builder: (cxt) => AttachInsuranceCardImageDialog(
fileNo: fileNo,
name: name,
identificationNo: identificationNo,
mobileNo: mobileNo,
image: (file, image) async {
GifLoaderDialogUtils.showMyDialog(context);
await model.uploadInsuranceCard(context, patientIdentificationID: patientIdentificationID, patientID: patientID, image: image);

@ -1,5 +1,6 @@
import 'package:diplomaticquarterapp/core/service/insurance_service.dart';
import 'package:diplomaticquarterapp/core/viewModels/insurance_card_View_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/pages/insurance/UpdateInsuranceManually.dart';
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
@ -7,6 +8,7 @@ import 'package:diplomaticquarterapp/uitl/utils_new.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../../locator.dart';
import '../../widgets/dialogs/confirm_dialog.dart';
@ -18,8 +20,11 @@ class InsurancePage extends StatelessWidget {
InsurancePage({Key key, this.model}) : super(key: key);
ProjectViewModel projectViewModel;
@override
Widget build(BuildContext context) {
projectViewModel = Provider.of(context);
return SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(12.0),
@ -36,11 +41,16 @@ class InsurancePage extends StatelessWidget {
getDetails(
setupID: '010266',
projectID: 15,
patientIdentificationID: model.user.patientIdentificationNo,
patientID: model.user.patientID,
patientIdentificationID: projectViewModel.user.patientIdentificationNo,
//model.user.patientIdentificationNo,
patientID: projectViewModel.user.patientID,
//model.user.patientID,
parentID: 0,
isFamily: false,
name: model.user.firstName + " " + model.user.lastName,
isFamily: projectViewModel.isLoginChild,
//false,
name: projectViewModel.user.firstName + " " + projectViewModel.user.lastName,
mobileNumber: projectViewModel.user.mobileNumber,
//model.user.firstName + " " + model.user.lastName,
context: context,
);
},
@ -54,7 +64,7 @@ class InsurancePage extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
model.user.firstName + " " + model.user.lastName,
projectViewModel.user.firstName + " " + projectViewModel.user.lastName,
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
@ -62,7 +72,7 @@ class InsurancePage extends StatelessWidget {
),
),
Text(
TranslationBase.of(context).fileno + ": " + model.user.patientID.toString(),
TranslationBase.of(context).fileno + ": " + projectViewModel.user.patientID.toString(), //model.user.patientID.toString(),
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w600,
@ -79,71 +89,73 @@ class InsurancePage extends StatelessWidget {
),
),
),
if (model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList != null ?? false)
ListView.separated(
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemBuilder: (context, index) {
return model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList[index].status == 3
? InkWell(
onTap: () {
getDetails(
projectID: 15,
patientIdentificationID: model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList[index].patientIdenficationNumber,
setupID: '010266',
patientID: model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList[index].responseID,
name: model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList[index].patientName,
parentID: model.user.patientID,
isFamily: true,
context: context);
},
child: Container(
width: double.infinity,
margin: EdgeInsets.only(top: 12.0),
if (!projectViewModel.isLoginChild)
if (model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList != null ?? false)
ListView.separated(
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemBuilder: (context, index) {
return model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList[index].status == 3
? InkWell(
onTap: () {
getDetails(
projectID: 15,
patientIdentificationID: model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList[index].patientIdenficationNumber,
setupID: '010266',
patientID: model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList[index].responseID,
name: model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList[index].patientName,
parentID: model.user.patientID,
isFamily: true,
mobileNumber: model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList[index].mobileNumber,
context: context);
},
child: Container(
decoration: cardRadius(12),
child: Padding(
padding: const EdgeInsets.all(12.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisSize: MainAxisSize.max,
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList[index].patientName,
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600, letterSpacing: -0.46),
),
Text(
TranslationBase.of(context).fileno + ": " + model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList[index].responseID.toString(),
style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, letterSpacing: -0.46),
),
],
width: double.infinity,
margin: EdgeInsets.only(top: 12.0),
child: Container(
decoration: cardRadius(12),
child: Padding(
padding: const EdgeInsets.all(12.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisSize: MainAxisSize.max,
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList[index].patientName,
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600, letterSpacing: -0.46),
),
Text(
TranslationBase.of(context).fileno + ": " + model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList[index].responseID.toString(),
style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, letterSpacing: -0.46),
),
],
),
),
),
Icon(Icons.arrow_forward),
],
Icon(Icons.arrow_forward),
],
),
),
),
),
),
)
: Container();
},
separatorBuilder: (context, index) {
return mHeight(model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList[index].status == 3 ? 8 : 0);
},
itemCount: model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList.length,
),
)
: Container();
},
separatorBuilder: (context, index) {
return mHeight(model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList[index].status == 3 ? 8 : 0);
},
itemCount: model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList.length,
),
],
),
),
);
}
getDetails({String setupID, int projectID, String patientIdentificationID, int patientID, String name, bool isFamily, int parentID = 0, BuildContext context}) {
getDetails({String setupID, int projectID, String patientIdentificationID, int patientID, String name, String mobileNumber, bool isFamily, int parentID = 0, BuildContext context}) {
GifLoaderDialogUtils.showMyDialog(context);
_insuranceCardService
.getPatientInsuranceDetails(setupID: setupID, projectID: projectID, patientID: patientID, patientIdentificationID: patientIdentificationID, isFamily: isFamily, parentID: parentID)
@ -158,23 +170,34 @@ class InsurancePage extends StatelessWidget {
patientID: patientID,
patientIdentificationID: patientIdentificationID,
name: name,
mobileNo: mobileNumber,
))).then((value) {
model.getInsuranceUpdated();
});
} else {
// AppToast.showErrorToast(message: _insuranceCardService.error);
updateManually(context, _insuranceCardService.error);
updateManually(context, _insuranceCardService.error, patientIdentificationID, patientID, mobileNumber);
}
});
}
void updateManually(BuildContext context, String errorMsg) {
void updateManually(BuildContext context, String errorMsg, String patientIdentificationID, int patientID, String mobileNumber) {
ConfirmDialog dialog = new ConfirmDialog(
context: context,
confirmMessage: errorMsg + ". " + TranslationBase.of(context).updateInsuranceManuallyDialog,
okText: TranslationBase.of(context).yes,
cancelText: TranslationBase.of(context).no,
okFunction: () => {Navigator.pop(context), Navigator.push(context, FadePage(page: UpdateInsuranceManually()))},
okFunction: () => {
Navigator.pop(context),
Navigator.push(
context,
FadePage(
page: UpdateInsuranceManually(
patientIdentificationNo: patientIdentificationID,
patientID: patientID,
patientMobileNumber: mobileNumber,
)))
},
cancelFunction: () => {});
dialog.showAlertDialog(context);
}

@ -1,10 +1,12 @@
import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart';
import 'package:diplomaticquarterapp/core/viewModels/insurance_card_View_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../base/base_view.dart';
import 'insurance_page.dart';
@ -17,6 +19,7 @@ class InsuranceUpdate extends StatefulWidget {
class _InsuranceUpdateState extends State<InsuranceUpdate> with SingleTickerProviderStateMixin {
TabController _tabController;
List<ImagesInfo> imagesInfo = List();
ProjectViewModel projectViewModel;
@override
void initState() {
@ -33,6 +36,7 @@ class _InsuranceUpdateState extends State<InsuranceUpdate> with SingleTickerProv
}
Widget build(BuildContext context) {
projectViewModel = Provider.of(context);
return BaseView<InsuranceViewModel>(
onModelReady: (model) => model.getInsuranceUpdated(),
builder: (BuildContext context, InsuranceViewModel model, Widget child) => AppScaffold(
@ -123,7 +127,7 @@ class _InsuranceUpdateState extends State<InsuranceUpdate> with SingleTickerProv
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
model.user.firstName + " " + model.user.lastName,
projectViewModel.user.firstName + " " + projectViewModel.user.lastName,
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
@ -141,7 +145,6 @@ class _InsuranceUpdateState extends State<InsuranceUpdate> with SingleTickerProv
letterSpacing: -0.46,
),
),
Text(
model.insuranceUpdate[index].createdOn,
style: TextStyle(

@ -210,7 +210,7 @@ class _ViewDoctorResponsesPageState extends State<ViewDoctorResponsesPage> {
child: DefaultButton(
TranslationBase.of(context).submit,
() {
if (textController.text.isEmpty) {
if (rate == 0 && textController.text.isEmpty) {
AppToast.showErrorToast(message: "Please enter comments");
} else {
rateDoctorResponse();

@ -110,7 +110,7 @@ class _RequestTypePageState extends State<RequestTypePage> {
TranslationBase.of(context).submit,
() => {
model.sendRequestLOV(doctorList: widget.doctorList, requestType: parameterCode.toString(), remark: question).then((value) {
if (model.state != ViewState.ErrorLocal || model.state != ViewState.Error) {
if (model.state != ViewState.ErrorLocal && model.state != ViewState.Error) {
Navigator.pop(context);
AppToast.showSuccessToast(message: TranslationBase.of(context).RRTRequestSuccess);
}

@ -67,7 +67,7 @@ class _AdvancePaymentPageState extends State<AdvancePaymentPage> {
projectViewModel = Provider.of(context);
return BaseView<MyBalanceViewModel>(
onModelReady: (model) {
model.getHospitals();
model.getHospitals(isAdvancePayment: true);
model.getFamilyFiles();
},
builder: (_, model, w) => AppScaffold(
@ -315,7 +315,6 @@ class _AdvancePaymentPageState extends State<AdvancePaymentPage> {
advanceModel.patientName = patientName;
GifLoaderDialogUtils.showMyDialog(context);
model.getPatientInfoByPatientIDAndMobileNumber(advanceModel).then((value) {
GifLoaderDialogUtils.hideDialog(context);
if (model.state != ViewState.Error && model.state != ViewState.ErrorLocal) {
@ -327,7 +326,8 @@ class _AdvancePaymentPageState extends State<AdvancePaymentPage> {
onSelectedMethod: (String metohd, [String selectedInstallmentPlan]) {
setState(() {});
},
isShowInstallments: false, isFromAdvancePayment: true),
isShowInstallments: false,
isFromAdvancePayment: true),
),
).then(
(value) {

@ -24,6 +24,7 @@ import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:diplomaticquarterapp/widgets/otp/sms-popup.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
// import 'package:pay/pay.dart';
import 'package:provider/provider.dart';
@ -52,6 +53,7 @@ class _ConfirmPaymentPageState extends State<ConfirmPaymentPage> {
String tamaraPaymentStatus;
String tamaraOrderID;
// Pay _payClient;
@override
@ -137,7 +139,10 @@ class _ConfirmPaymentPageState extends State<ConfirmPaymentPage> {
: Image.asset(getImagePath(widget.selectedPaymentMethod)),
),
Text(
'${widget.advanceModel.amount} ' + TranslationBase.of(context).sar,
widget.advanceModel.hospitalsModel.projectOutSA
? '${widget.advanceModel.amount} ' + TranslationBase.of(context).aed
: '${widget.advanceModel.amount} ' + TranslationBase.of(context).sar,
// '${widget.advanceModel.amount} ' + TranslationBase.of(context).sar,
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w900,

@ -131,11 +131,16 @@ class _PatientSickLeavePageState extends State<PatientSickLeavePage> {
GifLoaderDialogUtils.showMyDialog(context);
service.getSickLeaveStatusByAdmissionNo(model.sickLeaveList[index].projectID, model.sickLeaveList[index].admissionNo).then((res) {
print(res);
GifLoaderDialogUtils.hideDialog(context);
if (res["List_GetSickLeaveStatusByAdmissionNo"].length != 0) {
admissionStatusForSickLeave = AdmissionStatusForSickLeave.fromJson(res["List_GetSickLeaveStatusByAdmissionNo"][0]);
if (admissionStatusForSickLeave.status != 6) {
AppToast.showErrorToast(message: TranslationBase.of(context).sickLeaveAdmittedPatient);
if (res != null && res["List_GetSickLeaveStatusByAdmissionNo"] != null) {
if (res["List_GetSickLeaveStatusByAdmissionNo"].length != 0) {
admissionStatusForSickLeave = AdmissionStatusForSickLeave.fromJson(res["List_GetSickLeaveStatusByAdmissionNo"][0]);
if (admissionStatusForSickLeave.status != 6) {
AppToast.showErrorToast(message: TranslationBase.of(context).sickLeaveAdmittedPatient);
} else {
openWorkPlaceUpdatePageFunc(requestNumber, setupID, model, index, projectID);
}
} else {
openWorkPlaceUpdatePageFunc(requestNumber, setupID, model, index, projectID);
}

@ -0,0 +1,132 @@
import 'package:diplomaticquarterapp/core/model/reports/admission_for_medical_report.dart';
import 'package:diplomaticquarterapp/core/viewModels/medical/reports_view_model.dart';
import 'package:diplomaticquarterapp/extensions/string_extensions.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/pages/medical/reports/report_list_widget.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart';
import 'package:diplomaticquarterapp/widgets/dialogs/ConfirmWithMessageDialog.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:flutter/material.dart';
class InPatientMedicalReports extends StatefulWidget {
final AdmissionMedicalReport admissionMedicalReport;
InPatientMedicalReports({@required this.admissionMedicalReport});
@override
State<InPatientMedicalReports> createState() => _InPatientMedicalReportsState();
}
class _InPatientMedicalReportsState extends State<InPatientMedicalReports> {
int _currentPage = 0;
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return BaseView<ReportsViewModel>(
onModelReady: (model) {
model.getInPatientReports();
},
builder: (_, model, widget) => AppScaffold(
isShowAppBar: true,
appBarTitle: TranslationBase.of(context).newMedReport,
title: TranslationBase.of(context).medReport,
showNewAppBar: true,
showNewAppBarTitle: true,
backgroundColor: Color(0xffF7F7F7),
body: Container(
child: Column(
children: [
Padding(
padding: EdgeInsets.all(21),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
myRadioButton(TranslationBase.of(context).requested, 0),
myRadioButton(TranslationBase.of(context).ready, 1),
myRadioButton(TranslationBase.of(context).cancelled, 2),
],
),
),
Expanded(
child: IndexedStack(
index: _currentPage,
children: [
ReportListWidget(reportList: model.reportsInPatientOrderRequestList, emailAddress: model.user.emailAddress),
ReportListWidget(reportList: model.reportsInPatientOrderReadyList, emailAddress: model.user.emailAddress),
ReportListWidget(reportList: model.reportsInPatientOrderCanceledList, emailAddress: model.user.emailAddress),
],
),
),
Padding(
padding: EdgeInsets.only(top: 16, bottom: 16, right: 21, left: 21),
child: DefaultButton(
TranslationBase.of(context).requestMedicalReport.toLowerCase().capitalizeFirstofEach,
() {
confirmBox(model);
},
),
),
],
),
),
),
);
}
void confirmBox(ReportsViewModel reportsViewModel) {
showDialog(
context: context,
builder: (cxt) => ConfirmWithMessageDialog(
message: TranslationBase.of(context).confirmMsgReport,
onTap: () => reportsViewModel.insertRequestForInPatientMedicalReport(widget.admissionMedicalReport.clinicID, widget.admissionMedicalReport.doctorID, widget.admissionMedicalReport.setupID,
widget.admissionMedicalReport.admissionNo, widget.admissionMedicalReport.projectID, TranslationBase.of(context).successSendReport),
),
);
return;
}
Widget myRadioButton(String _label, int _value) {
return InkWell(
onTap: () {
setState(() {
_currentPage = _value;
});
},
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
SizedBox(
width: 22,
height: 22,
child: Radio(
value: _value,
activeColor: _value == _currentPage ? Color(0xffD02127) : Color(0xffE8E8E8),
groupValue: _currentPage,
onChanged: (index) {
setState(() {
_currentPage = index;
});
},
),
),
SizedBox(width: 10),
Text(
_label,
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
color: Color(0xff575757),
letterSpacing: -0.56,
),
),
],
),
);
}
}

@ -1,14 +1,21 @@
import 'dart:ui';
import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart';
import 'package:diplomaticquarterapp/core/model/reports/admission_for_medical_report.dart';
import 'package:diplomaticquarterapp/core/viewModels/medical/reports_view_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/extensions/string_extensions.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/pages/medical/reports/inpatient_medical_reports_page.dart';
import 'package:diplomaticquarterapp/pages/medical/reports/report_list_widget.dart';
import 'package:diplomaticquarterapp/pages/medical/reports/reports_page.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/uitl/utils.dart';
import 'package:diplomaticquarterapp/uitl/utils_new.dart';
import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart';
import 'package:diplomaticquarterapp/widgets/my_rich_text.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:flutter/cupertino.dart';
@ -28,9 +35,6 @@ class _HomeReportPageState extends State<HomeReportPage> with SingleTickerProvid
@override
void initState() {
_tabController_new = TabController(length: 2, vsync: this);
WidgetsBinding.instance.addPostFrameCallback((_) {
getInPatientAdmissionList();
});
super.initState();
}
@ -50,7 +54,9 @@ class _HomeReportPageState extends State<HomeReportPage> with SingleTickerProvid
imagesInfo.add(ImagesInfo(
imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/medical-reorts/en/2.png', imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/medical-reorts/ar/2.png'));
return BaseView<ReportsViewModel>(
onModelReady: (model) => model.getReports(), //model.getPrescriptions(),
onModelReady: (model) {
model.getReports();
},
builder: (_, model, widget) => AppScaffold(
isShowAppBar: true,
appBarTitle: TranslationBase.of(context).newMedReport,
@ -87,53 +93,162 @@ class _HomeReportPageState extends State<HomeReportPage> with SingleTickerProvid
},
tabs: [
Text(
TranslationBase.of(context).inPatient,
TranslationBase.of(context).outpatient,
style: TextStyle(fontFamily: projectViewModel.isArabic ? 'Cairo' : 'Poppins'),
),
Text(
TranslationBase.of(context).outpatient,
TranslationBase.of(context).inPatient,
style: TextStyle(fontFamily: projectViewModel.isArabic ? 'Cairo' : 'Poppins'),
),
],
),
if (model.user != null)
Expanded(
child: TabBarView(
physics: BouncingScrollPhysics(),
controller: _tabController_new,
children: <Widget>[
Container(),
child:
TabBarView(
physics: BouncingScrollPhysics(),
controller: _tabController_new,
children: <Widget>[
Container(
child: Column(
children: [
Padding(
padding: EdgeInsets.all(21),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
myRadioButton(TranslationBase.of(context).requested, 0),
myRadioButton(TranslationBase.of(context).ready, 1),
myRadioButton(TranslationBase.of(context).cancelled, 2),
],
),
),
Expanded(
child: IndexedStack(
index: _currentPage,
child: Column(
children: [
Padding(
padding: EdgeInsets.all(21),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
myRadioButton(TranslationBase.of(context).requested, 0),
myRadioButton(TranslationBase.of(context).ready, 1),
myRadioButton(TranslationBase.of(context).cancelled, 2),
],
),
),
Expanded(
child: IndexedStack(
index: _currentPage,
children: [
ReportListWidget(reportList: model.reportsOrderRequestList, emailAddress: model.user.emailAddress),
ReportListWidget(reportList: model.reportsOrderReadyList, emailAddress: model.user.emailAddress),
ReportListWidget(reportList: model.reportsOrderCanceledList, emailAddress: model.user.emailAddress),
],
),
)
],
),
),
// InPatient Medical Reports
Container(
child: model.admissionsMedicalReportList.isNotEmpty
? Column(
children: [
ReportListWidget(reportList: model.reportsOrderRequestList, emailAddress: model.user.emailAddress),
ReportListWidget(reportList: model.reportsOrderReadyList, emailAddress: model.user.emailAddress),
ReportListWidget(reportList: model.reportsOrderCanceledList, emailAddress: model.user.emailAddress),
Padding(
padding: const EdgeInsets.all(16.0),
child: Text(
TranslationBase.of(context).selectAdmissionText,
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xff2E303A), letterSpacing: -0.64, height: 25 / 16),
),
),
ListView.separated(
physics: BouncingScrollPhysics(),
shrinkWrap: true,
padding: EdgeInsets.only(left: 21, right: 21, top: 12, bottom: 12),
itemBuilder: (context, index) {
AdmissionMedicalReport admissionMedicalReport = model.admissionsMedicalReportList[index];
return InkWell(
onTap: () {
Navigator.push(
context,
FadePage(
page: InPatientMedicalReports(
admissionMedicalReport: admissionMedicalReport,
)));
},
child: Container(
// height: 100.0,
decoration: BoxDecoration(
borderRadius: BorderRadius.all(
Radius.circular(10.0),
),
boxShadow: [
BoxShadow(
color: Color(0xff000000).withOpacity(.05),
blurRadius: 27,
offset: Offset(0, -3),
),
],
color: Colors.white),
child: Padding(
padding: const EdgeInsets.all(12.0),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
TranslationBase.of(context).dr + " " + admissionMedicalReport.doctorNameObj,
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xff2E303A), letterSpacing: -0.64, height: 25 / 16),
),
Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Text(DateUtil.getDayMonthYearDateFormatted(DateUtil.convertStringToDate(admissionMedicalReport.admissionDate)),
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600, color: Color(0xff2B353E), letterSpacing: -0.48, height: 18 / 12)),
Text(admissionMedicalReport.projectName,
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600, color: Color(0xff2B353E), letterSpacing: -0.48, height: 18 / 12)),
],
),
],
),
Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
if (admissionMedicalReport.clinicName != null)
MyRichText(TranslationBase.of(context).clinic + ":", admissionMedicalReport.clinicName, projectViewModel.isArabic),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
MyRichText(
TranslationBase.of(context).status + ":",
projectViewModel.isArabic ? admissionMedicalReport.statusDescriptionN : admissionMedicalReport.statusDescription,
projectViewModel.isArabic),
Icon(
Icons.arrow_forward,
color: Theme.of(context).primaryColor,
)
],
),
],
),
),
],
)
],
),
),
),
);
},
separatorBuilder: (context, index) => SizedBox(
height: 16.0,
),
itemCount: model.admissionsMedicalReportList.length),
],
),
)
],
),
)
: getNoDataWidget(context),
)
],
),
),
if (projectViewModel.havePrivilege(21) && _tabController_new.index == 1)
if (projectViewModel.havePrivilege(21)
// && _tabController_new.index == 0
)
Padding(
padding: EdgeInsets.only(top: 16, bottom: 16, right: 21, left: 21),
child: DefaultButton(
@ -193,6 +308,4 @@ class _HomeReportPageState extends State<HomeReportPage> with SingleTickerProvid
),
);
}
void getInPatientAdmissionList() {}
}

@ -1,3 +1,7 @@
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/core/model/reports/Reports.dart';
import 'package:diplomaticquarterapp/core/service/medical/reports_service.dart';
@ -14,6 +18,8 @@ import 'package:diplomaticquarterapp/widgets/dialogs/confirm_send_email_dialog.d
import 'package:diplomaticquarterapp/widgets/my_rich_text.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:open_filex/open_filex.dart';
import 'package:path_provider/path_provider.dart';
import 'package:provider/provider.dart';
import 'package:rating_bar/rating_bar.dart';
@ -91,8 +97,8 @@ class ReportListWidget extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
if (report.projectName != null) MyRichText(TranslationBase.of(context).clinic + ":", report.projectName, projectViewModel.isArabic),
if (report.clinicDescription != null) MyRichText(TranslationBase.of(context).hospital + ":", report.clinicDescription, projectViewModel.isArabic),
if (report.projectName != null) MyRichText(TranslationBase.of(context).hospital + ":", report.projectName, projectViewModel.isArabic),
if (report.clinicDescription != null) MyRichText(TranslationBase.of(context).clinic + ":", report.clinicDescription, projectViewModel.isArabic),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisSize: MainAxisSize.max,
@ -111,10 +117,22 @@ class ReportListWidget extends StatelessWidget {
if (reportList[index].status == 2)
Row(
children: [
Padding(
padding: const EdgeInsets.only(right: 11.0, left: 11.0),
child: Text(TranslationBase.of(context).viewReport,
style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, fontStyle: FontStyle.italic, color: CustomColors.accentColor, letterSpacing: -0.48, height: 18 / 12, decoration: TextDecoration.underline)),
InkWell(
onTap: () {
getMedicalReportPDF(report);
},
child: Padding(
padding: const EdgeInsets.only(right: 11.0, left: 11.0),
child: Text(TranslationBase.of(context).viewReport,
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w600,
fontStyle: FontStyle.italic,
color: CustomColors.accentColor,
letterSpacing: -0.48,
height: 18 / 12,
decoration: TextDecoration.underline)),
),
),
IconButton(
icon: Icon(Icons.email),
@ -155,6 +173,26 @@ class ReportListWidget extends StatelessWidget {
);
}
void getMedicalReportPDF(Reports report) {
GifLoaderDialogUtils.showMyDialog(AppGlobal.context);
ReportsService _reportsService = locator<ReportsService>();
_reportsService
.getMedicalReportPDF(report.projectName, report.clinicDescription, report.doctorName, DateUtil.convertDateToString(report.requestDate), report.invoiceNo.toString(), report.projectID,
DateUtil.convertDateToString(report.requestDate), report.setupId)
.then((value) async {
GifLoaderDialogUtils.hideDialog(AppGlobal.context);
try {
String path = await _createFileFromString(value["MedicalReportBase64"], "pdf");
OpenFilex.open(path);
} catch (ex) {
AppToast.showErrorToast(message: "Cannot open file.");
}
}).catchError((err) {
GifLoaderDialogUtils.hideDialog(AppGlobal.context);
print(err);
});
}
sendReportEmail(Reports report) {
GifLoaderDialogUtils.showMyDialog(AppGlobal.context);
ReportsService _reportsService = locator<ReportsService>();
@ -169,4 +207,12 @@ class ReportListWidget extends StatelessWidget {
print(err);
});
}
Future<String> _createFileFromString(String encodedStr, String ext) async {
Uint8List bytes = base64.decode(encodedStr);
String dir = (await getApplicationDocumentsDirectory()).path;
File file = File("$dir/" + DateTime.now().millisecondsSinceEpoch.toString() + "." + ext);
await file.writeAsBytes(bytes);
return file.path;
}
}

@ -24,7 +24,9 @@ class MedicalReports extends StatelessWidget {
message: TranslationBase.of(context).confirmMsgReport,
onTap: () => reportsViewModel.insertRequestForMedicalReport(model, TranslationBase.of(context).successSendReport),
),
);
).then((value) {
Navigator.pop(context);
});
return;
}

@ -1612,11 +1612,12 @@ class DoctorsListService extends BaseService {
return Future.value(localRes);
}
Future<Map> getLaserBodyPartsList(int laserCategoryID) async {
Future<Map> getLaserBodyPartsList(int laserCategoryID, int projectID) async {
Map<String, dynamic> request;
request = {
"LaserCategoryID": laserCategoryID,
"ProjectID": projectID,
};
dynamic localRes;
await baseAppClient.post(LASER_BODY_PARTS, onSuccess: (response, statusCode) async {
@ -1757,6 +1758,32 @@ class DoctorsListService extends BaseService {
return Future.value(localRes);
}
Future<Map> checkPatientNphiesEligibility(int projectID) async {
Map<String, dynamic> request;
request = {"ProjectID": projectID};
dynamic localRes;
await baseAppClient.post(CHECK_PATIENT_NPHIES_ELIGIBILITY, onSuccess: (response, statusCode) async {
localRes = response;
}, onFailure: (String error, int statusCode) {
throw error;
}, body: request);
return Future.value(localRes);
}
Future<Map> convertPatientToCash(int projectID) async {
Map<String, dynamic> request;
request = {"ProjectID": projectID};
dynamic localRes;
await baseAppClient.post(CONVERT_PATIENT_TO_CASH, onSuccess: (response, statusCode) async {
localRes = response;
}, onFailure: (String error, int statusCode) {
throw error;
}, body: request);
return Future.value(localRes);
}
Future<Map> getPayfortSDKTokenForPayment(String deviceID, String signatureValue, {bool isTest = true}) async {
Map<String, dynamic> request;
request = {"service_command": "SDK_TOKEN", "access_code": "BsM6He4FMBaZ86W64kjZ", "merchant_identifier": "ipxnRXXq", "language": "en", "device_id": deviceID, "signature": signatureValue};

@ -1071,6 +1071,8 @@ class TranslationBase {
String get sar => localizedValues['sar'][locale.languageCode];
String get aed => localizedValues['aed'][locale.languageCode];
String get payOnline => localizedValues['payOnline'][locale.languageCode];
String get cancelOrder => localizedValues['cancelOrder'][locale.languageCode];
@ -2936,6 +2938,8 @@ class TranslationBase {
String get proErrorMessage => localizedValues["proErrorMessage"][locale.languageCode];
String get admissionNo => localizedValues["admissionNo"][locale.languageCode];
String get admissionReqNo => localizedValues["admissionReqNo"][locale.languageCode];
String get dischargeDate => localizedValues["dischargeDate"][locale.languageCode];
String get selectAdmissionText => localizedValues["selectAdmissionText"][locale.languageCode];
}

@ -14,8 +14,9 @@ class ConfirmDialog {
final cancelText;
final Function okFunction;
final Function cancelFunction;
final isDissmissable;
ConfirmDialog({@required this.context, this.title, @required this.confirmMessage, @required this.okText, @required this.cancelText, @required this.okFunction, @required this.cancelFunction});
ConfirmDialog({@required this.context, this.title, @required this.confirmMessage, @required this.okText, @required this.cancelText, @required this.okFunction, @required this.cancelFunction, this.isDissmissable = true});
showAlertDialog(BuildContext context) {
Dialog alert = Dialog(
@ -35,6 +36,7 @@ class ConfirmDialog {
// show the dialog
showDialog(
barrierDismissible: isDissmissable,
context: context,
builder: (BuildContext context) {
return alert;
@ -99,7 +101,7 @@ class Mdialog extends StatelessWidget {
child: Container(
decoration: containerRadius(CustomColors.lightGreyColor, 12),
padding: EdgeInsets.only(top: 8,bottom: 8),
child: Center(child: Texts(cancelText)),
child: Center(child: Texts(cancelText, variant: "caption3")),
),
),
),
@ -114,6 +116,7 @@ class Mdialog extends StatelessWidget {
child: Texts(
okText,
color: Colors.white,
variant: "caption3",
),
),
),

@ -14,8 +14,9 @@ class RadioSelectionDialog extends StatefulWidget {
final List<RadioSelectionDialogModel> listData;
final int selectedIndex;
final bool isScrollable;
final bool isShowSearch;
const RadioSelectionDialog({Key key, this.onValueSelected, this.listData, this.selectedIndex, this.isScrollable = false}) : super(key: key);
const RadioSelectionDialog({Key key, this.onValueSelected, this.listData, this.selectedIndex, this.isScrollable = false, this.isShowSearch = false}) : super(key: key);
@override
State createState() => new RadioSelectionDialogState();
@ -24,10 +25,22 @@ class RadioSelectionDialog extends StatefulWidget {
class RadioSelectionDialogState extends State<RadioSelectionDialog> {
int selectedIndex;
List<RadioSelectionDialogModel> tempListData = [];
TextEditingController controller = new TextEditingController();
@override
void initState() {
selectedIndex = widget.selectedIndex ?? 0;
super.initState();
addAllData();
}
addAllData() {
tempListData.clear();
for (int i = 0; i < widget.listData.length; i++) {
tempListData.add(widget.listData[i]);
}
setState(() {});
}
Widget build(BuildContext context) {
@ -37,100 +50,131 @@ class RadioSelectionDialogState extends State<RadioSelectionDialog> {
insetPadding: EdgeInsets.only(left: 21, right: 21),
child: Padding(
padding: EdgeInsets.only(left: 20, right: 20, top: 18, bottom: 28),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Padding(
padding: const EdgeInsets.only(top: 16.0),
child: Text(
TranslationBase.of(context).select,
style: TextStyle(fontSize: 24, fontWeight: FontWeight.w600, color: Color(0xff2B353E), height: 35 / 24, letterSpacing: -0.96),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Padding(
padding: const EdgeInsets.only(top: 16.0),
child: Text(
TranslationBase.of(context).select,
style: TextStyle(fontSize: 24, fontWeight: FontWeight.w600, color: Color(0xff2B353E), height: 35 / 24, letterSpacing: -0.96),
),
),
),
),
IconButton(
padding: EdgeInsets.zero,
icon: Icon(Icons.close),
color: Color(0xff2B353E),
constraints: BoxConstraints(),
onPressed: () {
Navigator.pop(context);
},
)
],
),
SizedBox(height: 21),
Text(
TranslationBase.of(context).pleaseSelectFromBelowOptions,
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600, color: Color(0xff2B353E), letterSpacing: -0.56),
),
SizedBox(height: widget.isScrollable ? 12 : 0),
SizedBox(
height: widget.isScrollable ? MediaQuery.of(context).size.height * .4 : null,
child: ListView.separated(
physics: widget.isScrollable ? BouncingScrollPhysics() : NeverScrollableScrollPhysics(),
shrinkWrap: !widget.isScrollable,
padding: EdgeInsets.only(bottom: widget.isScrollable ? 21 : 42, top: 10),
itemBuilder: (context, index) {
return InkWell(
onTap: () {
setState(() {
selectedIndex = widget.listData[index].value;
});
},
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
width: 22,
height: 22,
child: Radio(
value: widget.listData[index].value,
groupValue: selectedIndex,
onChanged: (value) {
setState(() {
selectedIndex = value;
});
},
IconButton(
padding: EdgeInsets.zero,
icon: Icon(Icons.close),
color: Color(0xff2B353E),
constraints: BoxConstraints(),
onPressed: () {
Navigator.pop(context);
},
)
],
),
SizedBox(height: 21),
Text(
TranslationBase.of(context).pleaseSelectFromBelowOptions,
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600, color: Color(0xff2B353E), letterSpacing: -0.56),
),
widget.isShowSearch
? Padding(
padding: const EdgeInsets.all(8.0),
child: TextField(
controller: controller,
onChanged: (v) {
if (v.length > 0) {
tempListData.clear();
for (int i = 0; i < widget.listData.length; i++) {
if (widget.listData[i].title.toLowerCase().contains(v.toLowerCase())) {
tempListData.add(widget.listData[i]);
}
}
} else {
addAllData();
}
setState(() {});
},
decoration: InputDecoration(
hintStyle: TextStyle(fontSize: 17),
hintText: 'Search Insurance',
suffixIcon: Icon(Icons.search),
border: InputBorder.none,
contentPadding: EdgeInsets.all(12),
),
),
)
: Container(),
SizedBox(height: widget.isScrollable ? 12 : 0),
SizedBox(
height: widget.isScrollable ? MediaQuery.of(context).size.height * .4 : null,
child: ListView.separated(
physics: widget.isScrollable ? BouncingScrollPhysics() : NeverScrollableScrollPhysics(),
// shrinkWrap: !widget.isScrollable,
shrinkWrap: !widget.isScrollable,
padding: EdgeInsets.only(bottom: widget.isScrollable ? 21 : 42, top: 10),
itemBuilder: (context, index) {
return InkWell(
onTap: () {
setState(() {
selectedIndex = tempListData[index].value;
});
},
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
width: 22,
height: 22,
child: Radio(
value: tempListData[index].value,
groupValue: selectedIndex,
onChanged: (value) {
setState(() {
selectedIndex = value;
});
},
),
),
),
SizedBox(width: 8),
Expanded(
child: Text(
widget.listData[index].title,
// maxLines: 2,
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600, color: Color(0xff575757), letterSpacing: -0.56),
SizedBox(width: 8),
Expanded(
child: Text(
tempListData[index].title,
// maxLines: 2,
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600, color: Color(0xff575757), letterSpacing: -0.56),
),
),
),
],
),
);
},
separatorBuilder: (context, index) => SizedBox(height: 10),
itemCount: widget.listData.length),
),
SizedBox(height: widget.isScrollable ? 12 : 0),
Row(
mainAxisSize: MainAxisSize.min,
children: [
Expanded(
child: DefaultButton(
TranslationBase.of(context).save,
() {
Navigator.pop(context);
widget.onValueSelected(selectedIndex);
],
),
);
},
color: Color(0xff349745),
separatorBuilder: (context, index) => SizedBox(height: 10),
itemCount: tempListData.length),
),
SizedBox(height: widget.isScrollable ? 12 : 0),
Row(
mainAxisSize: MainAxisSize.min,
children: [
Expanded(
child: DefaultButton(
TranslationBase.of(context).save,
() {
Navigator.pop(context);
widget.onValueSelected(selectedIndex);
},
color: Color(0xff349745),
),
),
),
],
),
],
],
),
],
),
),
),
);

@ -1,7 +1,7 @@
name: diplomaticquarterapp
description: A new Flutter application.
version: 4.5.024+4050024
version: 4.5.026+4050026
environment:
sdk: ">=2.7.0 <3.0.0"
@ -208,6 +208,9 @@ dependencies:
sms_otp_auto_verify: ^2.1.0
flutter_ios_voip_kit: ^0.0.5
google_api_availability: ^3.0.1
# open_file: ^3.2.1
open_filex: ^4.3.2
path_provider: ^2.0.8
# flutter_callkit_incoming: ^1.0.3+3
# firebase_core: 1.12.0
@ -217,7 +220,7 @@ dependencies:
dependency_overrides:
provider: ^5.0.0
# permission_handler : ^10.2.0
flutter_svg: ^1.0.0
flutter_svg: ^1.1.6
# firebase_messaging_platform_interface: any
# flutter_inappwebview: 5.7.2+3
# git:

Loading…
Cancel
Save