updates & fixes

development-3.3_voipCall
haroon amjad 2 years ago
parent 4741a7b66d
commit fc21961807

Binary file not shown.

@ -0,0 +1,4 @@
storePassword=HmGsa123
keyPassword=HmGsa123
keyAlias=hmgdoctor
storeFile=doctor_app_key

@ -115,8 +115,8 @@ class BaseAppClient {
// print("ProjectID :"); // print("ProjectID :");
// print(body['ProjectID']); // print(body['ProjectID']);
print("URL : $url"); debugPrint("URL : $url");
print("Body : ${json.encode(body)}"); debugPrint("Body : ${json.encode(body)}");
var asd = json.encode(body); var asd = json.encode(body);
var asd2; var asd2;
if (await Utils.checkConnection()) { if (await Utils.checkConnection()) {

@ -446,7 +446,7 @@ const TRANSACTION_NO = 0;
const LANGUAGE_ID = 2; const LANGUAGE_ID = 2;
const STAMP = '2020-04-27T12:17:17.721Z'; const STAMP = '2020-04-27T12:17:17.721Z';
const IP_ADDRESS = '9.9.9.9'; const IP_ADDRESS = '9.9.9.9';
const VERSION_ID = 8.6; const VERSION_ID = 8.7;
const CHANNEL = 9; const CHANNEL = 9;
const SESSION_ID = 'BlUSkYymTt'; const SESSION_ID = 'BlUSkYymTt';
const IS_LOGIN_FOR_DOCTOR_APP = true; const IS_LOGIN_FOR_DOCTOR_APP = true;

@ -18,19 +18,15 @@ import '../../locator.dart';
class UcafViewModel extends BaseViewModel { class UcafViewModel extends BaseViewModel {
UcafService _ucafService = locator<UcafService>(); UcafService _ucafService = locator<UcafService>();
List<GetChiefComplaintResModel> get patientChiefComplaintList => List<GetChiefComplaintResModel> get patientChiefComplaintList => _ucafService.patientChiefComplaintList;
_ucafService.patientChiefComplaintList;
List<VitalSignHistory> get patientVitalSignsHistory => List<VitalSignHistory> get patientVitalSignsHistory => _ucafService.patientVitalSignsHistory;
_ucafService.patientVitalSignsHistory;
List<GetAssessmentResModel> get patientAssessmentList => List<GetAssessmentResModel> get patientAssessmentList => _ucafService.patientAssessmentList;
_ucafService.patientAssessmentList;
List<MasterKeyModel> get diagnosisTypes => _ucafService.listOfDiagnosisType; List<MasterKeyModel> get diagnosisTypes => _ucafService.listOfDiagnosisType;
List<MasterKeyModel> get diagnosisConditions => List<MasterKeyModel> get diagnosisConditions => _ucafService.listOfDiagnosisCondition;
_ucafService.listOfDiagnosisCondition;
PrescriptionModel get prescriptionList => _ucafService.prescriptionList; PrescriptionModel get prescriptionList => _ucafService.prescriptionList;
@ -75,7 +71,7 @@ class UcafViewModel extends BaseViewModel {
// await _ucafService.getPatientVitalSignsHistory(patient, from, to); // await _ucafService.getPatientVitalSignsHistory(patient, from, to);
await _ucafService.getInPatientVitalSignHistory(patient, false); await _ucafService.getInPatientVitalSignHistory(patient, false);
await _ucafService.getPatientChiefComplaint(patient); // await _ucafService.getPatientChiefComplaint(patient);
if (_ucafService.hasError) { if (_ucafService.hasError) {
error = _ucafService.error; error = _ucafService.error;
@ -91,23 +87,16 @@ class UcafViewModel extends BaseViewModel {
if (bodyMax == "0" || bodyMax == null || bodyMax == 'null') { if (bodyMax == "0" || bodyMax == null || bodyMax == 'null') {
bodyMax = element.bodyMassIndex.toString(); bodyMax = element.bodyMassIndex.toString();
} }
if (temperatureCelcius == "0" || if (temperatureCelcius == "0" || temperatureCelcius == null || temperatureCelcius == 'null') {
temperatureCelcius == null ||
temperatureCelcius == 'null') {
temperatureCelcius = element.temperatureCelcius.toString(); temperatureCelcius = element.temperatureCelcius.toString();
} }
if (hartRat == "0" || hartRat == null || hartRat == 'null') { if (hartRat == "0" || hartRat == null || hartRat == 'null') {
hartRat = element.pulseBeatPerMinute.toString(); hartRat = element.pulseBeatPerMinute.toString();
} }
if (respirationBeatPerMinute == "0" || if (respirationBeatPerMinute == "0" || respirationBeatPerMinute == null || respirationBeatPerMinute == 'null') {
respirationBeatPerMinute == null || respirationBeatPerMinute = element.respirationBeatPerMinute.toString();
respirationBeatPerMinute == 'null') {
respirationBeatPerMinute =
element.respirationBeatPerMinute.toString();
} }
if (bloodPressure == "0 / 0" || if (bloodPressure == "0/0" || bloodPressure == null || bloodPressure == 'null') {
bloodPressure == null ||
bloodPressure == 'null') {
bloodPressure = element.bloodPressure.toString(); bloodPressure = element.bloodPressure.toString();
} }
}); });
@ -126,8 +115,7 @@ class UcafViewModel extends BaseViewModel {
} else { } else {
if (patientAssessmentList.isNotEmpty) { if (patientAssessmentList.isNotEmpty) {
if (diagnosisConditions.length == 0) { if (diagnosisConditions.length == 0) {
await _ucafService await _ucafService.getMasterLookup(MasterKeysService.DiagnosisCondition);
.getMasterLookup(MasterKeysService.DiagnosisCondition);
} }
if (diagnosisTypes.length == 0) { if (diagnosisTypes.length == 0) {
await _ucafService.getMasterLookup(MasterKeysService.DiagnosisType); await _ucafService.getMasterLookup(MasterKeysService.DiagnosisType);
@ -169,13 +157,11 @@ class UcafViewModel extends BaseViewModel {
} }
} }
MasterKeyModel findMasterDataById( MasterKeyModel findMasterDataById({@required MasterKeysService masterKeys, dynamic id}) {
{@required MasterKeysService masterKeys, dynamic id}) {
switch (masterKeys) { switch (masterKeys) {
case MasterKeysService.DiagnosisCondition: case MasterKeysService.DiagnosisCondition:
List<MasterKeyModel> result = diagnosisConditions.where((element) { List<MasterKeyModel> result = diagnosisConditions.where((element) {
return element.id == id && return element.id == id && element.typeId == masterKeys.getMasterKeyService();
element.typeId == masterKeys.getMasterKeyService();
}).toList(); }).toList();
if (result.isNotEmpty) { if (result.isNotEmpty) {
return result.first; return result.first;
@ -183,8 +169,7 @@ class UcafViewModel extends BaseViewModel {
return null; return null;
case MasterKeysService.DiagnosisType: case MasterKeysService.DiagnosisType:
List<MasterKeyModel> result = diagnosisTypes.where((element) { List<MasterKeyModel> result = diagnosisTypes.where((element) {
return element.id == id && return element.id == id && element.typeId == masterKeys.getMasterKeyService();
element.typeId == masterKeys.getMasterKeyService();
}).toList(); }).toList();
if (result.isNotEmpty) { if (result.isNotEmpty) {
return result.first; return result.first;

@ -7,8 +7,7 @@ import 'package:doctor_app_flutter/core/model/labs/patient_lab_orders.dart';
import 'package:doctor_app_flutter/core/model/labs/patient_lab_special_result.dart'; import 'package:doctor_app_flutter/core/model/labs/patient_lab_special_result.dart';
import 'package:doctor_app_flutter/core/model/procedure/ControlsModel.dart'; import 'package:doctor_app_flutter/core/model/procedure/ControlsModel.dart';
import 'package:doctor_app_flutter/core/model/procedure/categories_procedure.dart'; import 'package:doctor_app_flutter/core/model/procedure/categories_procedure.dart';
import 'package:doctor_app_flutter/core/model/procedure/categories_procedure.dart' import 'package:doctor_app_flutter/core/model/procedure/categories_procedure.dart' as cpe;
as cpe;
import 'package:doctor_app_flutter/core/model/procedure/get_ordered_procedure_model.dart'; import 'package:doctor_app_flutter/core/model/procedure/get_ordered_procedure_model.dart';
import 'package:doctor_app_flutter/core/model/procedure/post_procedure_req_model.dart'; import 'package:doctor_app_flutter/core/model/procedure/post_procedure_req_model.dart';
import 'package:doctor_app_flutter/core/model/procedure/procedure_templateModel.dart'; import 'package:doctor_app_flutter/core/model/procedure/procedure_templateModel.dart';
@ -36,14 +35,11 @@ class ProcedureViewModel extends BaseViewModel {
bool hasError = false; bool hasError = false;
ProcedureService _procedureService = locator<ProcedureService>(); ProcedureService _procedureService = locator<ProcedureService>();
List<GetOrderedProcedureModel> get procedureList => List<GetOrderedProcedureModel> get procedureList => _procedureService.procedureList;
_procedureService.procedureList;
List<ProcedureValadteModel> get valadteProcedureList => List<ProcedureValadteModel> get valadteProcedureList => _procedureService.valadteProcedureList;
_procedureService.valadteProcedureList;
List<CategoriseProcedureModel> get categoriesList => List<CategoriseProcedureModel> get categoriesList => _procedureService.categoriesList;
_procedureService.categoriesList;
List<dynamic> get categoryList => _procedureService.categoryList; List<dynamic> get categoryList => _procedureService.categoryList;
RadiologyService _radiologyService = locator<RadiologyService>(); RadiologyService _radiologyService = locator<RadiologyService>();
@ -51,44 +47,31 @@ class ProcedureViewModel extends BaseViewModel {
List<FinalRadiologyList> _finalRadiologyListClinic = List(); List<FinalRadiologyList> _finalRadiologyListClinic = List();
List<FinalRadiologyList> _finalRadiologyListHospital = List(); List<FinalRadiologyList> _finalRadiologyListHospital = List();
List<FinalRadiologyList> get finalRadiologyList => List<FinalRadiologyList> get finalRadiologyList => filterType == FilterType.Clinic ? _finalRadiologyListClinic : _finalRadiologyListHospital;
filterType == FilterType.Clinic
? _finalRadiologyListClinic
: _finalRadiologyListHospital;
List<FinalRadiology> get radiologyList => List<FinalRadiology> get radiologyList => _radiologyService.finalRadiologyList;
_radiologyService.finalRadiologyList;
List<PatientLabOrders> get patientLabOrdersList => List<PatientLabOrders> get patientLabOrdersList => _labsService.patientLabOrdersList;
_labsService.patientLabOrdersList;
List<LabOrderResult> get labOrdersResultsList => List<LabOrderResult> get labOrdersResultsList => _labsService.labOrdersResultsList;
_labsService.labOrdersResultsList;
List<ProcedureTempleteDetailsModel> get procedureTemplate => List<ProcedureTempleteDetailsModel> get procedureTemplate => _procedureService.templateList;
_procedureService.templateList;
List<ProcedureTempleteDetailsModelList> templateList = List(); List<ProcedureTempleteDetailsModelList> templateList = List();
List<ProcedureTempleteDetailsModel> get procedureTemplateDetails => List<ProcedureTempleteDetailsModel> get procedureTemplateDetails => _procedureService.templateDetailsList;
_procedureService.templateDetailsList;
bool _isRadiologyVIDAPlus = false; bool _isRadiologyVIDAPlus = false;
bool get isRadiologyVIDAPlus => _isRadiologyVIDAPlus; bool get isRadiologyVIDAPlus => _isRadiologyVIDAPlus;
Future getProcedure( Future getProcedure({int mrn, String patientType, int appointmentNo, bool isLocalBusy = false}) async {
{int mrn,
String patientType,
int appointmentNo,
bool isLocalBusy = false}) async {
hasError = false; hasError = false;
await getDoctorProfile(); await getDoctorProfile();
if (isLocalBusy) if (isLocalBusy)
setState(ViewState.BusyLocal); setState(ViewState.BusyLocal);
else else
setState(ViewState.Busy); setState(ViewState.Busy);
await _procedureService.getProcedure( await _procedureService.getProcedure(mrn: mrn, appointmentNo: appointmentNo);
mrn: mrn, appointmentNo: appointmentNo);
if (_procedureService.hasError) { if (_procedureService.hasError) {
error = _procedureService.error; error = _procedureService.error;
if (patientType == "7") if (patientType == "7")
@ -99,21 +82,14 @@ class ProcedureViewModel extends BaseViewModel {
setState(ViewState.Idle); setState(ViewState.Idle);
} }
Future getProcedureCategory( Future getProcedureCategory({String categoryName, String categoryID, patientId, bool isLocalBusy = false}) async {
{String categoryName,
String categoryID,
patientId,
bool isLocalBusy = false}) async {
if (categoryName == null) return; if (categoryName == null) return;
hasError = false; hasError = false;
if (isLocalBusy) if (isLocalBusy)
setState(ViewState.BusyLocal); setState(ViewState.BusyLocal);
else else
setState(ViewState.Busy); setState(ViewState.Busy);
await _procedureService.getProcedureCategory( await _procedureService.getProcedureCategory(categoryName: categoryName, categoryID: categoryID, patientId: patientId);
categoryName: categoryName,
categoryID: categoryID,
patientId: patientId);
if (_procedureService.hasError) { if (_procedureService.hasError) {
error = _procedureService.error; error = _procedureService.error;
setState(ViewState.ErrorLocal); setState(ViewState.ErrorLocal);
@ -133,17 +109,13 @@ class ProcedureViewModel extends BaseViewModel {
setState(ViewState.Idle); setState(ViewState.Idle);
} }
Future getProcedureTemplate( Future getProcedureTemplate({String categoryID, bool isLocalBusy = false, BuildContext context}) async {
{String categoryID,
bool isLocalBusy = false,
BuildContext context}) async {
if (isLocalBusy) { if (isLocalBusy) {
setState(ViewState.BusyLocal); setState(ViewState.BusyLocal);
} else { } else {
setState(ViewState.Busy); setState(ViewState.Busy);
} }
await _procedureService.getProcedureTemplate( await _procedureService.getProcedureTemplate(categoryID: categoryID, isLocalBusy: false);
categoryID: categoryID, isLocalBusy: false);
if (_procedureService.hasError) { if (_procedureService.hasError) {
error = _procedureService.error; error = _procedureService.error;
setState(ViewState.ErrorLocal); setState(ViewState.ErrorLocal);
@ -154,20 +126,12 @@ class ProcedureViewModel extends BaseViewModel {
setTemplateListDependOnId() { setTemplateListDependOnId() {
procedureTemplate.forEach((element) { procedureTemplate.forEach((element) {
List<ProcedureTempleteDetailsModelList> templateListData = templateList List<ProcedureTempleteDetailsModelList> templateListData = templateList.where((elementTemplate) => elementTemplate.templateId == element.templateID).toList();
.where((elementTemplate) =>
elementTemplate.templateId == element.templateID)
.toList();
if (templateListData.length != 0) { if (templateListData.length != 0) {
templateList[templateList.indexOf(templateListData[0])] templateList[templateList.indexOf(templateListData[0])].procedureTemplate.add(element);
.procedureTemplate
.add(element);
} else { } else {
var template = ProcedureTempleteDetailsModelList( var template = ProcedureTempleteDetailsModelList(templateName: element.templateName, templateId: element.templateID, template: element);
templateName: element.templateName,
templateId: element.templateID,
template: element);
if (!templateList.contains(template)) templateList.add(template); if (!templateList.contains(template)) templateList.add(template);
} }
}); });
@ -189,8 +153,7 @@ class ProcedureViewModel extends BaseViewModel {
setState(ViewState.Idle); setState(ViewState.Idle);
} }
Future postProcedure(PostProcedureReqModel postProcedureReqModel, int mrn, Future postProcedure(PostProcedureReqModel postProcedureReqModel, int mrn, {bool isLocalBusy = false}) async {
{bool isLocalBusy = false}) async {
hasError = false; hasError = false;
if (isLocalBusy) if (isLocalBusy)
setState(ViewState.BusyLocal); setState(ViewState.BusyLocal);
@ -201,14 +164,12 @@ class ProcedureViewModel extends BaseViewModel {
error = _procedureService.error; error = _procedureService.error;
setState(ViewState.ErrorLocal); setState(ViewState.ErrorLocal);
} else { } else {
await getProcedure(mrn: mrn, isLocalBusy:isLocalBusy); await getProcedure(mrn: mrn, isLocalBusy: isLocalBusy);
setState(ViewState.Idle); setState(ViewState.Idle);
} }
} }
Future validationProcedure( Future validationProcedure(ProcedureValidationRequestModel procedureValidateRequestModel, {bool isLocalBusy = false}) async {
ProcedureValidationRequestModel procedureValidateRequestModel,
{bool isLocalBusy = false}) async {
hasError = false; hasError = false;
if (isLocalBusy) { if (isLocalBusy) {
setState(ViewState.BusyLocal); setState(ViewState.BusyLocal);
@ -224,12 +185,12 @@ class ProcedureViewModel extends BaseViewModel {
} }
} }
Future updateProcedure( Future updateProcedure({UpdateProcedureRequestModel updateProcedureRequestModel, int mrn, bool isLocalBusy = false}) async {
{UpdateProcedureRequestModel updateProcedureRequestModel,
int mrn, bool isLocalBusy = false}) async {
hasError = false; hasError = false;
if(isLocalBusy)setState(ViewState.BusyLocal); else if (isLocalBusy)
setState(ViewState.Busy); setState(ViewState.BusyLocal);
else
setState(ViewState.Busy);
await _procedureService.updateProcedure(updateProcedureRequestModel); await _procedureService.updateProcedure(updateProcedureRequestModel);
if (_procedureService.hasError) { if (_procedureService.hasError) {
error = _procedureService.error; error = _procedureService.error;
@ -239,11 +200,9 @@ class ProcedureViewModel extends BaseViewModel {
//await getProcedure(mrn: mrn); //await getProcedure(mrn: mrn);
} }
void getPatientRadOrders(PatiantInformtion patient, void getPatientRadOrders(PatiantInformtion patient, {String patientType, bool isInPatient = false}) async {
{String patientType, bool isInPatient = false}) async {
setState(ViewState.Busy); setState(ViewState.Busy);
await _radiologyService.getPatientRadOrders(patient, await _radiologyService.getPatientRadOrders(patient, isInPatient: isInPatient);
isInPatient: isInPatient);
_isRadiologyVIDAPlus = _radiologyService.isRadiologyVIDAPlus; _isRadiologyVIDAPlus = _radiologyService.isRadiologyVIDAPlus;
if (_radiologyService.hasError) { if (_radiologyService.hasError) {
error = _radiologyService.error; error = _radiologyService.error;
@ -253,39 +212,25 @@ class ProcedureViewModel extends BaseViewModel {
setState(ViewState.ErrorLocal); setState(ViewState.ErrorLocal);
} else { } else {
_radiologyService.finalRadiologyList.forEach((element) { _radiologyService.finalRadiologyList.forEach((element) {
List<FinalRadiologyList> finalRadiologyListClinic = List<FinalRadiologyList> finalRadiologyListClinic = _finalRadiologyListClinic.where((elementClinic) => elementClinic.filterName == element.clinicDescription).toList();
_finalRadiologyListClinic
.where((elementClinic) =>
elementClinic.filterName == element.clinicDescription)
.toList();
if (finalRadiologyListClinic.length != 0) { if (finalRadiologyListClinic.length != 0) {
_finalRadiologyListClinic[ _finalRadiologyListClinic[finalRadiologyListClinic.indexOf(finalRadiologyListClinic[0])].finalRadiologyList.add(element);
finalRadiologyListClinic.indexOf(finalRadiologyListClinic[0])]
.finalRadiologyList
.add(element);
} else { } else {
_finalRadiologyListClinic.add(FinalRadiologyList( _finalRadiologyListClinic.add(FinalRadiologyList(filterName: element.clinicDescription, finalRadiology: element));
filterName: element.clinicDescription, finalRadiology: element));
} }
// FinalRadiologyList list sort via project // FinalRadiologyList list sort via project
List<FinalRadiologyList> finalRadiologyListHospital = List<FinalRadiologyList> finalRadiologyListHospital = _finalRadiologyListHospital
_finalRadiologyListHospital .where(
.where( (elementClinic) => elementClinic.filterName == element.projectName,
(elementClinic) => )
elementClinic.filterName == element.projectName, .toList();
)
.toList();
if (finalRadiologyListHospital.length != 0) { if (finalRadiologyListHospital.length != 0) {
_finalRadiologyListHospital[finalRadiologyListHospital _finalRadiologyListHospital[finalRadiologyListHospital.indexOf(finalRadiologyListHospital[0])].finalRadiologyList.add(element);
.indexOf(finalRadiologyListHospital[0])]
.finalRadiologyList
.add(element);
} else { } else {
_finalRadiologyListHospital.add(FinalRadiologyList( _finalRadiologyListHospital.add(FinalRadiologyList(filterName: element.projectName, finalRadiology: element));
filterName: element.projectName, finalRadiology: element));
} }
}); });
@ -295,17 +240,9 @@ class ProcedureViewModel extends BaseViewModel {
String get radImageURL => _radiologyService.url; String get radImageURL => _radiologyService.url;
getRadImageURL( getRadImageURL({int invoiceNo, int lineItem, int projectId, @required PatiantInformtion patient}) async {
{int invoiceNo,
int lineItem,
int projectId,
@required PatiantInformtion patient}) async {
setState(ViewState.Busy); setState(ViewState.Busy);
await _radiologyService.getRadImageURL( await _radiologyService.getRadImageURL(invoiceNo: invoiceNo, lineItem: lineItem, projectId: projectId, patient: patient);
invoiceNo: invoiceNo,
lineItem: lineItem,
projectId: projectId,
patient: patient);
if (_radiologyService.hasError) { if (_radiologyService.hasError) {
error = _radiologyService.error; error = _radiologyService.error;
setState(ViewState.Error); setState(ViewState.Error);
@ -318,8 +255,7 @@ class ProcedureViewModel extends BaseViewModel {
notifyListeners(); notifyListeners();
} }
List<PatientLabSpecialResult> get patientLabSpecialResult => List<PatientLabSpecialResult> get patientLabSpecialResult => _labsService.patientLabSpecialResult;
_labsService.patientLabSpecialResult;
List<LabResult> get labResultList => _labsService.labResultList; List<LabResult> get labResultList => _labsService.labResultList;
@ -340,19 +276,9 @@ class ProcedureViewModel extends BaseViewModel {
} }
} }
getLaboratoryResult( getLaboratoryResult({String projectID, int clinicID, String invoiceNo, String orderNo, PatiantInformtion patient}) async {
{String projectID,
int clinicID,
String invoiceNo,
String orderNo,
PatiantInformtion patient}) async {
setState(ViewState.Busy); setState(ViewState.Busy);
await _labsService.getLaboratoryResult( await _labsService.getLaboratoryResult(invoiceNo: invoiceNo, orderNo: orderNo, projectID: projectID, clinicID: clinicID, patient: patient);
invoiceNo: invoiceNo,
orderNo: orderNo,
projectID: projectID,
clinicID: clinicID,
patient: patient);
if (_labsService.hasError) { if (_labsService.hasError) {
error = _labsService.error; error = _labsService.error;
setState(ViewState.Error); setState(ViewState.Error);
@ -361,15 +287,9 @@ class ProcedureViewModel extends BaseViewModel {
} }
} }
getPatientLabOrdersResults( getPatientLabOrdersResults({PatientLabOrders patientLabOrder, String procedure, PatiantInformtion patient}) async {
{PatientLabOrders patientLabOrder,
String procedure,
PatiantInformtion patient}) async {
setState(ViewState.Busy); setState(ViewState.Busy);
await _labsService.getPatientLabOrdersResults( await _labsService.getPatientLabOrdersResults(patientLabOrder: patientLabOrder, procedure: procedure, patient: patient);
patientLabOrder: patientLabOrder,
procedure: procedure,
patient: patient);
if (_labsService.hasError) { if (_labsService.hasError) {
error = _labsService.error; error = _labsService.error;
setState(ViewState.Error); setState(ViewState.Error);
@ -377,9 +297,7 @@ class ProcedureViewModel extends BaseViewModel {
bool isShouldClear = false; bool isShouldClear = false;
if (_labsService.labOrdersResultsList.length == 1) { if (_labsService.labOrdersResultsList.length == 1) {
labOrdersResultsList.forEach((element) { labOrdersResultsList.forEach((element) {
if (element.resultValue.contains('/') || if (element.resultValue.contains('/') || element.resultValue.contains('*') || element.resultValue.isEmpty) isShouldClear = true;
element.resultValue.contains('*') ||
element.resultValue.isEmpty) isShouldClear = true;
}); });
} }
if (isShouldClear) _labsService.labOrdersResultsList.clear(); if (isShouldClear) _labsService.labOrdersResultsList.clear();
@ -410,8 +328,7 @@ class ProcedureViewModel extends BaseViewModel {
setState(ViewState.Busy); setState(ViewState.Busy);
} }
PostProcedureReqModel postProcedureReqModel = new PostProcedureReqModel(); PostProcedureReqModel postProcedureReqModel = new PostProcedureReqModel();
ProcedureValidationRequestModel procedureValadteRequestModel = ProcedureValidationRequestModel procedureValadteRequestModel = new ProcedureValidationRequestModel();
new ProcedureValidationRequestModel();
procedureValadteRequestModel.patientMRN = patient.patientMRN; procedureValadteRequestModel.patientMRN = patient.patientMRN;
procedureValadteRequestModel.episodeID = patient.episodeNo; procedureValadteRequestModel.episodeID = patient.episodeNo;
procedureValadteRequestModel.appointmentNo = patient.appointmentNo; procedureValadteRequestModel.appointmentNo = patient.appointmentNo;
@ -426,48 +343,34 @@ class ProcedureViewModel extends BaseViewModel {
procedureValadteRequestModel.procedure = [element.procedureId]; procedureValadteRequestModel.procedure = [element.procedureId];
List<Controls> controls = List(); List<Controls> controls = List();
controls.add( controls.add(
Controls( Controls(code: "remarks", controlValue: element.remarks != null ? element.remarks : ""),
code: "remarks",
controlValue: element.remarks != null ? element.remarks : ""),
); );
controls.add( controls.add(
Controls( Controls(code: "ordertype", controlValue: procedureType == ProcedureType.PROCEDURE ? element.type ?? "1" : "0"),
code: "ordertype",
controlValue: procedureType == ProcedureType.PROCEDURE
? element.type ?? "1"
: "0"),
); );
controlsProcedure.add(Procedures( controlsProcedure.add(Procedures(category: element.categoryID, procedure: element.procedureId, controls: controls));
category: element.categoryID,
procedure: element.procedureId,
controls: controls));
}); });
postProcedureReqModel.procedures = controlsProcedure; postProcedureReqModel.procedures = controlsProcedure;
await validationProcedure(procedureValadteRequestModel, await validationProcedure(procedureValadteRequestModel, isLocalBusy: isLocalBusy);
isLocalBusy: isLocalBusy);
if (state == ViewState.Idle) { if (state == ViewState.Idle) {
if (valadteProcedureList[0].entityList.length == 0) { if (valadteProcedureList[0].entityList.length == 0) {
await postProcedure(postProcedureReqModel, patient.patientMRN, await postProcedure(postProcedureReqModel, patient.patientMRN, isLocalBusy: isLocalBusy);
isLocalBusy: isLocalBusy);
if (state == ViewState.ErrorLocal) { if (state == ViewState.ErrorLocal) {
Utils.showErrorToast(error); Utils.showErrorToast(error);
getProcedure(mrn: patient.patientMRN, isLocalBusy: isLocalBusy); getProcedure(mrn: patient.patientMRN, isLocalBusy: isLocalBusy);
} else if (state == ViewState.Idle) { } else if (state == ViewState.Idle) {
DrAppToastMsg.showSuccesToast('procedure has been added'); DrAppToastMsg.showSuccesToast('procedure has been added');
if (Navigator.canPop(AppGlobal.CONTEX)) if (Navigator.canPop(AppGlobal.CONTEX)) Navigator.pop(AppGlobal.CONTEX);
Navigator.pop(AppGlobal.CONTEX); if (Navigator.canPop(AppGlobal.CONTEX)) Navigator.pop(AppGlobal.CONTEX);
if (Navigator.canPop(AppGlobal.CONTEX))
Navigator.pop(AppGlobal.CONTEX);
} }
} else { } else {
if (state == ViewState.ErrorLocal) { if (state == ViewState.ErrorLocal) {
Utils.showErrorToast(error); Utils.showErrorToast(error);
getProcedure(mrn: patient.patientMRN); getProcedure(mrn: patient.patientMRN);
} else if (state == ViewState.Idle) { } else if (state == ViewState.Idle) {
Utils.showErrorToast( Utils.showErrorToast(valadteProcedureList[0].entityList[0].warringMessages);
valadteProcedureList[0].entityList[0].warringMessages);
} }
} }
} else { } else {
@ -475,34 +378,23 @@ class ProcedureViewModel extends BaseViewModel {
} }
} }
bool isEntityListSelected( bool isEntityListSelected(cpe.EntityList masterKey, List<cpe.EntityList> entityList) {
cpe.EntityList masterKey, List<cpe.EntityList> entityList) { Iterable<cpe.EntityList> history = entityList.where((element) => masterKey.procedureId == element.procedureId);
Iterable<cpe.EntityList> history = entityList
.where((element) => masterKey.procedureId == element.procedureId);
if (history.length > 0) { if (history.length > 0) {
return true; return true;
} }
return false; return false;
} }
bool isProcedureEntityListSelected(ProcedureTempleteDetailsModel masterKey, bool isProcedureEntityListSelected(ProcedureTempleteDetailsModel masterKey, List<ProcedureTempleteDetailsModel> entityList) {
List<ProcedureTempleteDetailsModel> entityList) { Iterable<ProcedureTempleteDetailsModel> history = entityList.where((element) => masterKey.templateID == element.templateID && masterKey.procedureName == element.procedureName);
Iterable<ProcedureTempleteDetailsModel> history = entityList.where(
(element) =>
masterKey.templateID == element.templateID &&
masterKey.procedureName == element.procedureName);
if (history.length > 0) { if (history.length > 0) {
return true; return true;
} }
return false; return false;
} }
Future addProcedures( Future addProcedures(ProcedureViewModel model, List<ProcedureTempleteDetailsModel> items, PatiantInformtion patient, TextEditingController remarksController, {bool isLocalBusy = false}) async {
ProcedureViewModel model,
List<ProcedureTempleteDetailsModel> items,
PatiantInformtion patient,
TextEditingController remarksController,
{bool isLocalBusy = false}) async {
if (isLocalBusy) { if (isLocalBusy) {
setState(ViewState.BusyLocal); setState(ViewState.BusyLocal);
} else { } else {
@ -523,15 +415,10 @@ class ProcedureViewModel extends BaseViewModel {
eventCategory: "Procedure Checkout Screen", eventCategory: "Procedure Checkout Screen",
eventAction: "Add New Procedure", eventAction: "Add New Procedure",
); );
await model.preparePostProcedure( await model.preparePostProcedure(entityList: entityList, patient: patient, remarks: remarksController.text, isLocalBusy: isLocalBusy);
entityList: entityList,
patient: patient,
remarks: remarksController.text,
isLocalBusy: isLocalBusy);
} }
Future filterSearchResults(String query, List<cpe.EntityList> masterList, Future filterSearchResults(String query, List<cpe.EntityList> masterList, List<cpe.EntityList> items) async {
List<cpe.EntityList> items) async {
List<cpe.EntityList> dummySearchList = List(); List<cpe.EntityList> dummySearchList = List();
dummySearchList.addAll(masterList); dummySearchList.addAll(masterList);
if (query.isNotEmpty) { if (query.isNotEmpty) {
@ -549,13 +436,9 @@ class ProcedureViewModel extends BaseViewModel {
} }
} }
void filterProcedureSearchResults( void filterProcedureSearchResults(String query, List<ProcedureTempleteModel> masterList, List<ProcedureTempleteModel> items) {
String query,
List<ProcedureTempleteModel> masterList,
List<ProcedureTempleteModel> items) {
List<ProcedureTempleteModel> dummySearchList = List(); List<ProcedureTempleteModel> dummySearchList = List();
if(masterList!= null) if (masterList != null) dummySearchList.addAll(masterList);
dummySearchList.addAll(masterList);
if (query.isNotEmpty) { if (query.isNotEmpty) {
List<ProcedureTempleteModel> dummyListData = List(); List<ProcedureTempleteModel> dummyListData = List();
dummySearchList.forEach((item) { dummySearchList.forEach((item) {

@ -31,24 +31,17 @@ class UpdateObjectivePage extends StatefulWidget {
final int currentIndex; final int currentIndex;
final PatiantInformtion patientInfo; final PatiantInformtion patientInfo;
UpdateObjectivePage( UpdateObjectivePage({Key key, this.changePageViewIndex, this.patientInfo, this.changeLoadingState, this.currentIndex});
{Key key,
this.changePageViewIndex,
this.patientInfo,
this.changeLoadingState,
this.currentIndex});
@override @override
_UpdateObjectivePageState createState() => _UpdateObjectivePageState(); _UpdateObjectivePageState createState() => _UpdateObjectivePageState();
} }
class _UpdateObjectivePageState extends State<UpdateObjectivePage> class _UpdateObjectivePageState extends State<UpdateObjectivePage> implements ObjectiveCallBack {
implements ObjectiveCallBack {
bool isSysExaminationExpand = false; bool isSysExaminationExpand = false;
List<MySelectedExamination> mySelectedExamination = List(); List<MySelectedExamination> mySelectedExamination = List();
BoxDecoration containerBorderDecoration( BoxDecoration containerBorderDecoration(Color containerColor, Color borderColor) {
Color containerColor, Color borderColor) {
return BoxDecoration( return BoxDecoration(
color: containerColor, color: containerColor,
shape: BoxShape.rectangle, shape: BoxShape.rectangle,
@ -77,8 +70,7 @@ class _UpdateObjectivePageState extends State<UpdateObjectivePage>
masterKeys: MasterKeysService.PhysicalExamination, masterKeys: MasterKeysService.PhysicalExamination,
id: element.examId, id: element.examId,
); );
MySelectedExamination tempEam = MySelectedExamination tempEam = SoapUtils.generateMySelectedExamination(
SoapUtils.generateMySelectedExamination(
examination: examMaster, examination: examMaster,
remark: element.remarks, remark: element.remarks,
isNormal: element.isNormal, isNormal: element.isNormal,
@ -113,8 +105,7 @@ class _UpdateObjectivePageState extends State<UpdateObjectivePage>
patientInfo: widget.patientInfo, patientInfo: widget.patientInfo,
), ),
ExpandableSOAPWidget( ExpandableSOAPWidget(
headerTitle: headerTitle: TranslationBase.of(context).physicalSystemExamination,
TranslationBase.of(context).physicalSystemExamination,
onTap: () { onTap: () {
setState(() { setState(() {
isSysExaminationExpand = !isSysExaminationExpand; isSysExaminationExpand = !isSysExaminationExpand;
@ -123,14 +114,12 @@ class _UpdateObjectivePageState extends State<UpdateObjectivePage>
child: Column( child: Column(
children: [ children: [
SOAPOpenItems( SOAPOpenItems(
label: label: "${TranslationBase.of(context).addExamination}",
"${TranslationBase.of(context).addExamination}",
onTap: () { onTap: () {
openExaminationList(context); openExaminationList(context);
}, },
), ),
if (mySelectedExamination.isNotEmpty && if (mySelectedExamination.isNotEmpty && mySelectedExamination.first.isLocal)
mySelectedExamination.first.isLocal)
Row( Row(
children: [ children: [
AppText( AppText(
@ -143,25 +132,14 @@ class _UpdateObjectivePageState extends State<UpdateObjectivePage>
), ),
Column( Column(
children: mySelectedExamination children: mySelectedExamination
.sublist( .sublist(0, model.getFirstIndexForOldExamination(mySelectedExamination) == -1 ? 0 : model.getFirstIndexForOldExamination(mySelectedExamination))
0,
model.getFirstIndexForOldExamination(
mySelectedExamination) ==
-1
? 0
: model.getFirstIndexForOldExamination(
mySelectedExamination))
.map((examination) { .map((examination) {
return ExaminationItemCard(examination, () { return ExaminationItemCard(examination, () {
removeExamination( removeExamination(examination.selectedExamination);
examination.selectedExamination);
}); });
}).toList(), }).toList(),
), ),
if (mySelectedExamination.isNotEmpty && if (mySelectedExamination.isNotEmpty && model.getFirstIndexForOldExamination(mySelectedExamination) > -1)
model.getFirstIndexForOldExamination(
mySelectedExamination) >
-1)
Row( Row(
children: [ children: [
AppText( AppText(
@ -174,16 +152,10 @@ class _UpdateObjectivePageState extends State<UpdateObjectivePage>
), ),
Column( Column(
children: mySelectedExamination children: mySelectedExamination
.sublist(model.getFirstIndexForOldExamination( .sublist(model.getFirstIndexForOldExamination(mySelectedExamination) == -1 ? 0 : model.getFirstIndexForOldExamination(mySelectedExamination))
mySelectedExamination) ==
-1
? 0
: model.getFirstIndexForOldExamination(
mySelectedExamination))
.map((examination) { .map((examination) {
return ExaminationItemCard(examination, () { return ExaminationItemCard(examination, () {
removeExamination( removeExamination(examination.selectedExamination);
examination.selectedExamination);
}); });
}).toList(), }).toList(),
) )
@ -192,8 +164,7 @@ class _UpdateObjectivePageState extends State<UpdateObjectivePage>
isExpanded: isSysExaminationExpand, isExpanded: isSysExaminationExpand,
), ),
SizedBox( SizedBox(
height: SizeConfig.heightMultiplier * height: SizeConfig.heightMultiplier * (SizeConfig.isHeightVeryShort ? 14 : 12),
(SizeConfig.isHeightVeryShort ? 14 : 12),
) )
], ],
), ),
@ -206,33 +177,20 @@ class _UpdateObjectivePageState extends State<UpdateObjectivePage>
submitUpdateObjectivePage(SOAPViewModel model) async { submitUpdateObjectivePage(SOAPViewModel model) async {
if (mySelectedExamination.isNotEmpty) { if (mySelectedExamination.isNotEmpty) {
if (!model.isAddExamInProgress && if (!model.isAddExamInProgress && widget.patientInfo.admissionNo != null && widget.patientInfo.admissionNo.isNotEmpty) {
widget.patientInfo.admissionNo != null &&
widget.patientInfo.admissionNo.isNotEmpty) {
Navigator.of(context).pop(); Navigator.of(context).pop();
} else { } else {
widget.changeLoadingState(true); widget.changeLoadingState(true);
Map profile = await sharedPref.getObj(DOCTOR_PROFILE); Map profile = await sharedPref.getObj(DOCTOR_PROFILE);
DoctorProfileModel doctorProfile = DoctorProfileModel.fromJson(profile); DoctorProfileModel doctorProfile = DoctorProfileModel.fromJson(profile);
PostPhysicalExamRequestModel postPhysicalExamRequestModel = PostPhysicalExamRequestModel postPhysicalExamRequestModel = new PostPhysicalExamRequestModel();
new PostPhysicalExamRequestModel();
mySelectedExamination.forEach((exam) { mySelectedExamination.forEach((exam) {
if (postPhysicalExamRequestModel if (postPhysicalExamRequestModel.listHisProgNotePhysicalExaminationVM == null) postPhysicalExamRequestModel.listHisProgNotePhysicalExaminationVM = [];
.listHisProgNotePhysicalExaminationVM == ListHisProgNotePhysicalExaminationVM listHisProgNotePhysicalExaminationVM = ListHisProgNotePhysicalExaminationVM(
null)
postPhysicalExamRequestModel.listHisProgNotePhysicalExaminationVM =
[];
ListHisProgNotePhysicalExaminationVM
listHisProgNotePhysicalExaminationVM =
ListHisProgNotePhysicalExaminationVM(
patientMRN: widget.patientInfo.patientMRN, patientMRN: widget.patientInfo.patientMRN,
episodeId: widget.patientInfo.episodeNo == null episodeId: widget.patientInfo.episodeNo == null ? 0 : widget.patientInfo.episodeNo,
? 0 appointmentNo: widget.patientInfo.appointmentNo == null ? 0 : widget.patientInfo.appointmentNo,
: widget.patientInfo.episodeNo,
appointmentNo: widget.patientInfo.appointmentNo == null
? 0
: widget.patientInfo.appointmentNo,
remarks: exam.remark ?? '', remarks: exam.remark ?? '',
createdBy: exam.createdBy ?? doctorProfile.doctorID, createdBy: exam.createdBy ?? doctorProfile.doctorID,
createdOn: exam.createdOn ?? DateTime.now().toIso8601String(), createdOn: exam.createdOn ?? DateTime.now().toIso8601String(),
@ -255,15 +213,12 @@ class _UpdateObjectivePageState extends State<UpdateObjectivePage>
: "Not Examined", : "Not Examined",
isNew: exam.isNew, isNew: exam.isNew,
); );
if (widget.patientInfo.admissionNo != null && if (widget.patientInfo.admissionNo != null && widget.patientInfo.admissionNo.isNotEmpty) {
widget.patientInfo.admissionNo.isNotEmpty) { listHisProgNotePhysicalExaminationVM.admissionNo = int.parse(widget.patientInfo.admissionNo);
listHisProgNotePhysicalExaminationVM.admissionNo =
int.parse(widget.patientInfo.admissionNo);
} else { } else {
listHisProgNotePhysicalExaminationVM.admissionNo = 0; listHisProgNotePhysicalExaminationVM.admissionNo = 0;
} }
postPhysicalExamRequestModel.listHisProgNotePhysicalExaminationVM postPhysicalExamRequestModel.listHisProgNotePhysicalExaminationVM.add(listHisProgNotePhysicalExaminationVM);
.add(listHisProgNotePhysicalExaminationVM);
}); });
if (model.patientPhysicalExamList.isEmpty) { if (model.patientPhysicalExamList.isEmpty) {
@ -275,14 +230,12 @@ class _UpdateObjectivePageState extends State<UpdateObjectivePage>
if (model.state == ViewState.ErrorLocal) { if (model.state == ViewState.ErrorLocal) {
widget.changeLoadingState(false); widget.changeLoadingState(false);
Utils.showErrorToast(model.error); Utils.showErrorToast(model.error);
if (widget.patientInfo.admissionNo != null && if (widget.patientInfo.admissionNo != null && widget.patientInfo.admissionNo.isNotEmpty) {
widget.patientInfo.admissionNo.isNotEmpty) {
// Navigator.of(context).pop(); // Navigator.of(context).pop();
model.isAddExamInProgress = false; model.isAddExamInProgress = false;
} }
} else { } else {
if (widget.patientInfo.admissionNo != null && if (widget.patientInfo.admissionNo != null && widget.patientInfo.admissionNo.isNotEmpty) {
widget.patientInfo.admissionNo.isNotEmpty) {
// Navigator.of(context).pop(); // Navigator.of(context).pop();
widget.changeLoadingState(false); widget.changeLoadingState(false);
model.isAddExamInProgress = false; model.isAddExamInProgress = false;
@ -298,10 +251,7 @@ class _UpdateObjectivePageState extends State<UpdateObjectivePage>
} }
removeExamination(MasterKeyModel masterKey) { removeExamination(MasterKeyModel masterKey) {
Iterable<MySelectedExamination> history = mySelectedExamination.where( Iterable<MySelectedExamination> history = mySelectedExamination.where((element) => masterKey.id == element.selectedExamination.id && masterKey.typeId == element.selectedExamination.typeId);
(element) =>
masterKey.id == element.selectedExamination.id &&
masterKey.typeId == element.selectedExamination.typeId);
if (history.length > 0) { if (history.length > 0) {
setState(() { setState(() {
@ -322,17 +272,11 @@ class _UpdateObjectivePageState extends State<UpdateObjectivePage>
FadePage( FadePage(
page: AddExaminationPage( page: AddExaminationPage(
mySelectedExamination: mySelectedExamination, mySelectedExamination: mySelectedExamination,
addSelectedExamination: addSelectedExamination: (List<MySelectedExamination> mySelectedExaminationLocal) {
(List<MySelectedExamination> mySelectedExaminationLocal) {
setState(() { setState(() {
{ {
mySelectedExaminationLocal.forEach((element) { mySelectedExaminationLocal.forEach((element) {
if ((mySelectedExamination.singleWhere( if ((mySelectedExamination.singleWhere((it) => it.selectedExamination.id == element.selectedExamination.id, orElse: () => null)) == null) {
(it) =>
it.selectedExamination.id ==
element.selectedExamination.id,
orElse: () => null)) ==
null) {
mySelectedExamination.insert(0, element); mySelectedExamination.insert(0, element);
} }
}); });
@ -340,12 +284,7 @@ class _UpdateObjectivePageState extends State<UpdateObjectivePage>
/// remove items. /// remove items.
List<MySelectedExamination> removedList = []; List<MySelectedExamination> removedList = [];
mySelectedExamination.forEach((element) { mySelectedExamination.forEach((element) {
if ((mySelectedExaminationLocal.singleWhere( if ((mySelectedExaminationLocal.singleWhere((it) => it.selectedExamination.id == element.selectedExamination.id, orElse: () => null)) == null) {
(it) =>
it.selectedExamination.id ==
element.selectedExamination.id,
orElse: () => null)) ==
null) {
removedList.add(element); removedList.add(element);
} }
}); });

@ -4,48 +4,19 @@ import 'package:doctor_app_flutter/core/model/SOAP/selected_items/my_selected_ex
import 'package:doctor_app_flutter/core/model/SOAP/selected_items/my_selected_history.dart'; import 'package:doctor_app_flutter/core/model/SOAP/selected_items/my_selected_history.dart';
class SoapUtils { class SoapUtils {
static MySelectedHistory generateMySelectedHistory( static MySelectedHistory generateMySelectedHistory({history, isChecked = false, remark, isLocal = true}) {
{history, isChecked = false, remark, isLocal = true}) { MySelectedHistory mySelectedHistory = MySelectedHistory(selectedHistory: history, isChecked: isChecked, remark: remark, isLocal: isLocal);
MySelectedHistory mySelectedHistory = MySelectedHistory(
selectedHistory: history,
isChecked: isChecked,
remark: remark,
isLocal: isLocal);
return mySelectedHistory; return mySelectedHistory;
} }
static MySelectedAllergy generateMySelectedAllergy( static MySelectedAllergy generateMySelectedAllergy({allergy, allergySeverity, isChecked = false, remark, isLocal = true, int createdBy, bool isExpanded = false}) {
{allergy, MySelectedAllergy mySelectedAllergy =
allergySeverity, MySelectedAllergy(selectedAllergy: allergy, selectedAllergySeverity: allergySeverity, isChecked: isChecked, remark: remark, isLocal: isLocal, createdBy: createdBy, isExpanded: isExpanded);
isChecked = false,
remark,
isLocal = true,
int createdBy,
bool isExpanded = false}) {
MySelectedAllergy mySelectedAllergy = MySelectedAllergy(
selectedAllergy: allergy,
selectedAllergySeverity: allergySeverity,
isChecked: isChecked,
remark: remark,
isLocal: isLocal,
createdBy: createdBy,
isExpanded: isExpanded);
return mySelectedAllergy; return mySelectedAllergy;
} }
static MySelectedExamination generateMySelectedExamination( static MySelectedExamination generateMySelectedExamination(
{examination, {examination, allergySeverity, isChecked = false, remark, isLocal = true, isNormal, createdBy, createdOn, editedOn, notExamined, isNew, isAbnormal}) {
allergySeverity,
isChecked = false,
remark,
isLocal = true,
isNormal,
createdBy,
createdOn,
editedOn,
notExamined,
isNew,
isAbnormal}) {
MySelectedExamination mySelectedExamination = MySelectedExamination( MySelectedExamination mySelectedExamination = MySelectedExamination(
selectedExamination: examination, selectedExamination: examination,
remark: remark, remark: remark,
@ -61,17 +32,7 @@ class SoapUtils {
return mySelectedExamination; return mySelectedExamination;
} }
static MySelectedAssessment generateMySelectedAssessment( static MySelectedAssessment generateMySelectedAssessment({appointmentNo, remark, diagnosisType, diagnosisCondition, selectedICD, doctorID, doctorName, createdBy, createdOn, icdCode10ID}) {
{appointmentNo,
remark,
diagnosisType,
diagnosisCondition,
selectedICD,
doctorID,
doctorName,
createdBy,
createdOn,
icdCode10ID}) {
MySelectedAssessment mySelectedAssessment = MySelectedAssessment( MySelectedAssessment mySelectedAssessment = MySelectedAssessment(
appointmentId: appointmentNo, appointmentId: appointmentNo,
remark: remark, remark: remark,

@ -11,7 +11,7 @@ description: A new Flutter project.
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at # Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 4.3.5+1 version: 1.3.97+1
environment: environment:

Loading…
Cancel
Save