done My balance

find_us
Mohammad Aljammal 4 years ago
parent 4dd3f9ad01
commit a0300738e8

@ -7,7 +7,7 @@ const MAX_SMALL_SCREEN = 660;
const BASE_URL = 'https://hmgwebservices.com/'; const BASE_URL = 'https://hmgwebservices.com/';
const GET_PROJECT = '/Lists.svc/REST/GetProject'; const GET_PROJECT = 'Services/Lists.svc/REST/GetProject';
///Doctor ///Doctor
const GET_MY_DOCTOR = const GET_MY_DOCTOR =
@ -193,6 +193,14 @@ const GET_PATIENT_SICK_LEAVE = 'Services/Patients.svc/REST/GetPatientSickLeave';
const SendSickLeaveEmail = 'Services/Notifications.svc/REST/SendSickLeaveEmail'; const SendSickLeaveEmail = 'Services/Notifications.svc/REST/SendSickLeaveEmail';
const GET_PATIENT_AdVANCE_BALANCE_AMOUNT = 'Services/Patients.svc/REST/GetPatientAdvanceBalanceAmount';
const GET_PATIENT_INFO_BY_ID = 'Services/Doctors.svc/REST/GetPatientInfoByPatientID';
const GET_PATIENT_INFO_BY_ID_AND_MOBILE_NUMBER = 'Services/Patients.svc/REST/AP_GetPatientInfoByPatientIDandMobileNumber';
const SEND_ACTIVATION_CODE_FOR_ADVANCE_PAYMENT = 'Services/Authentication.svc/REST/SendActivationCodeForAdvancePayment';
const CHECK_ACTIVATION_CODE_FOR_ADVANCE_PAYMENT = 'Services/Authentication.svc/REST/CheckActivationCodeForAdvancePayment';
const TIMER_MIN = 10;
class AppGlobal { class AppGlobal {
static var context; static var context;

@ -1,18 +1,18 @@
class HospitalsModel { class HospitalsModel {
String desciption; String desciption;
Null desciptionN; Null desciptionN;
int iD; dynamic iD;
String legalName; String legalName;
String legalNameN; String legalNameN;
String name; String name;
Null nameN; Null nameN;
String phoneNumber; String phoneNumber;
String setupID; String setupID;
int distanceInKilometers; dynamic distanceInKilometers;
bool isActive; bool isActive;
String latitude; String latitude;
String longitude; String longitude;
int mainProjectID; dynamic mainProjectID;
Null projectOutSA; Null projectOutSA;
bool usingInDoctorApp; bool usingInDoctorApp;

@ -0,0 +1,18 @@
import 'package:diplomaticquarterapp/core/model/hospitals/hospitals_model.dart';
class AdvanceModel {
String fileNumber;
String amount;
HospitalsModel hospitalsModel;
String email;
String note;
String depositorName;
AdvanceModel(
{this.amount,
this.email,
this.note,
this.hospitalsModel,
this.fileNumber,
this.depositorName});
}

@ -0,0 +1,28 @@
class PatientAdvanceBalanceAmount {
int distanceInKilometers;
dynamic patientAdvanceBalanceAmount;
String projectDescription;
int projectID;
PatientAdvanceBalanceAmount(
{this.distanceInKilometers,
this.patientAdvanceBalanceAmount,
this.projectDescription,
this.projectID});
PatientAdvanceBalanceAmount.fromJson(Map<String, dynamic> json) {
distanceInKilometers = json['DistanceInKilometers'];
patientAdvanceBalanceAmount = json['PatientAdvanceBalanceAmount'];
projectDescription = json['ProjectDescription'];
projectID = json['ProjectID'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['DistanceInKilometers'] = this.distanceInKilometers;
data['PatientAdvanceBalanceAmount'] = this.patientAdvanceBalanceAmount;
data['ProjectDescription'] = this.projectDescription;
data['ProjectID'] = this.projectID;
return data;
}
}

@ -0,0 +1,32 @@
class PatientInfo {
String fullName;
String mobileNumber;
int patientID;
int projectID;
String zipCode;
PatientInfo(
{this.fullName,
this.mobileNumber,
this.patientID,
this.projectID,
this.zipCode});
PatientInfo.fromJson(Map<String, dynamic> json) {
fullName = json['FullName'];
mobileNumber = json['MobileNumber'];
patientID = json['PatientID'];
projectID = json['ProjectID'];
zipCode = json['ZipCode'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['FullName'] = this.fullName;
data['MobileNumber'] = this.mobileNumber;
data['PatientID'] = this.patientID;
data['ProjectID'] = this.projectID;
data['ZipCode'] = this.zipCode;
return data;
}
}

@ -0,0 +1,84 @@
class PatientInfoAndMobileNumber {
String setupID;
int projectID;
int mainAccountID;
int patientType;
int patientID;
String firstName;
Null middleName;
Null lastName;
Null firstNameN;
Null middleNameN;
Null lastNameN;
Null gender;
Null dateofBirth;
Null dateofBirthN;
Null nationalityID;
String mobileNumber;
String emailAddress;
Null zipCode;
PatientInfoAndMobileNumber(
{this.setupID,
this.projectID,
this.mainAccountID,
this.patientType,
this.patientID,
this.firstName,
this.middleName,
this.lastName,
this.firstNameN,
this.middleNameN,
this.lastNameN,
this.gender,
this.dateofBirth,
this.dateofBirthN,
this.nationalityID,
this.mobileNumber,
this.emailAddress,
this.zipCode});
PatientInfoAndMobileNumber.fromJson(Map<String, dynamic> json) {
setupID = json['SetupID'];
projectID = json['ProjectID'];
mainAccountID = json['MainAccountID'];
patientType = json['PatientType'];
patientID = json['PatientID'];
firstName = json['FirstName'];
middleName = json['MiddleName'];
lastName = json['LastName'];
firstNameN = json['FirstNameN'];
middleNameN = json['MiddleNameN'];
lastNameN = json['LastNameN'];
gender = json['Gender'];
dateofBirth = json['DateofBirth'];
dateofBirthN = json['DateofBirthN'];
nationalityID = json['NationalityID'];
mobileNumber = json['MobileNumber'];
emailAddress = json['EmailAddress'];
zipCode = json['ZipCode'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['SetupID'] = this.setupID;
data['ProjectID'] = this.projectID;
data['MainAccountID'] = this.mainAccountID;
data['PatientType'] = this.patientType;
data['PatientID'] = this.patientID;
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['Gender'] = this.gender;
data['DateofBirth'] = this.dateofBirth;
data['DateofBirthN'] = this.dateofBirthN;
data['NationalityID'] = this.nationalityID;
data['MobileNumber'] = this.mobileNumber;
data['EmailAddress'] = this.emailAddress;
data['ZipCode'] = this.zipCode;
return data;
}
}

@ -97,6 +97,7 @@ class SickLeave {
patientName = json['PatientName']; patientName = json['PatientName'];
projectName = json['ProjectName']; projectName = json['ProjectName'];
qR = json['QR']; qR = json['QR'];
if(json['Speciality']!=null)
speciality = json['Speciality'].cast<String>(); speciality = json['Speciality'].cast<String>();
} }

@ -2,26 +2,33 @@ import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/core/model/hospitals/hospitals_model.dart'; import 'package:diplomaticquarterapp/core/model/hospitals/hospitals_model.dart';
import 'package:diplomaticquarterapp/core/model/hospitals/request_get_hospitals_model.dart'; import 'package:diplomaticquarterapp/core/model/hospitals/request_get_hospitals_model.dart';
import 'package:diplomaticquarterapp/core/service/base_service.dart'; import 'package:diplomaticquarterapp/core/service/base_service.dart';
import 'package:geolocator/geolocator.dart';
class HospitalService extends BaseService { class HospitalService extends BaseService {
List<HospitalsModel> _hospitals = List(); List<HospitalsModel> _hospitals = List();
List<HospitalsModel> get hospitals => _hospitals; List<HospitalsModel> get hospitals => _hospitals;
RequestGetHospitalsModel _requestGetHospitalsModel = RequestGetHospitalsModel( double _latitude;
latitude: 0, double _longitude;
longitude: 0,
versionID: 5.2, _getCurrentLocation() async {
channel: 3, await getLastKnownPosition().then((value) {
languageID: 2, _latitude = value.latitude;
iPAdress: '10.20.10.20', _longitude = value.longitude;
generalid: 'Cs2020@2016\$2958', }).catchError((e) {
patientOutSA: 0, _longitude = 0;
sessionID: 'JUWuiMBCEGkAAxQpakQ', _latitude = 0;
isDentalAllowedBackend: false, });
deviceTypeID: 2); // currentLocation = LatLng(position.latitude, position.longitude);
}
Future getHospitals() async { Future getHospitals() async {
await _getCurrentLocation();
Map<String, dynamic> body = Map();
body['Latitude'] = _latitude;
body['Longitude'] = _longitude;
await baseAppClient.post(GET_PROJECT, await baseAppClient.post(GET_PROJECT,
onSuccess: (dynamic response, int statusCode) { onSuccess: (dynamic response, int statusCode) {
_hospitals.clear(); _hospitals.clear();
@ -31,6 +38,7 @@ class HospitalService extends BaseService {
}, onFailure: (String error, int statusCode) { }, onFailure: (String error, int statusCode) {
hasError = true; hasError = true;
super.error = error; super.error = error;
}, body: _requestGetHospitalsModel.toJson()); }, body: body);
} }
} }

@ -0,0 +1,148 @@
import 'dart:convert';
import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
import 'package:diplomaticquarterapp/core/model/my_balance/patient_advance_balance_amount.dart';
import 'package:diplomaticquarterapp/core/model/my_balance/patient_info.dart';
import 'package:diplomaticquarterapp/core/model/my_balance/patient_info_and_mobile_number.dart';
import 'package:diplomaticquarterapp/core/service/base_service.dart';
import 'package:diplomaticquarterapp/models/FamilyFiles/GetAllSharedRecordByStatusResponse.dart';
import 'package:diplomaticquarterapp/models/FamilyFiles/GetAllSharedRecordsByStatusReq.dart';
import 'package:diplomaticquarterapp/services/family_files/family_files_provider.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
class MyBalanceService extends BaseService {
List<PatientAdvanceBalanceAmount> patientAdvanceBalanceAmountList = List();
double totalAdvanceBalanceAmount;
List<PatientInfo> patientInfoList = List();
GetAllSharedRecordsByStatusResponse getAllSharedRecordsByStatusResponse =
GetAllSharedRecordsByStatusResponse();
PatientInfoAndMobileNumber patientInfoAndMobileNumber;
String logInTokenID;
String verificationCode;
getPatientAdvanceBalanceAmount() async {
hasError = false;
super.error = "";
await baseAppClient.post(GET_PATIENT_AdVANCE_BALANCE_AMOUNT,
onSuccess: (response, statusCode) async {
patientAdvanceBalanceAmountList.clear();
response['List_PatientAdvanceBalanceAmount'].forEach((item) {
patientAdvanceBalanceAmountList
.add(PatientAdvanceBalanceAmount.fromJson(item));
});
totalAdvanceBalanceAmount = response['TotalAdvanceBalanceAmount'];
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: Map());
}
getPatientInfoByPatientID({String id}) async {
hasError = false;
super.error = "";
Map<String, dynamic> body = Map();
body['SearchPatientID'] = int.parse(id);
body['isDentalAllowedBackend'] = false;
await baseAppClient.post(GET_PATIENT_INFO_BY_ID,
onSuccess: (response, statusCode) async {
patientInfoList.clear();
response['GetPatientInfoByPatientIDList'].forEach((item) {
patientInfoList.add(PatientInfo.fromJson(item));
});
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: body);
}
getPatientInfoByPatientIDAndMobileNumber() async {
hasError = false;
super.error = "";
Map<String, dynamic> body = Map();
body['isDentalAllowedBackend'] = false;
body['MobileNo'] = user.mobileNumber;
body['ProjectID'] = user.projectID;
await baseAppClient.post(GET_PATIENT_INFO_BY_ID_AND_MOBILE_NUMBER,
onSuccess: (response, statusCode) async {
response['List_PatientInfo'].forEach((item) {
patientInfoAndMobileNumber = PatientInfoAndMobileNumber.fromJson(item);
});
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
super.error = error;
}, body: body);
}
sendActivationCodeForAdvancePayment({int patientID,int projectID}) async {
hasError = false;
super.error = "";
Map<String, dynamic> body = Map();
body['PatientID'] = patientID;
body['ProjectID'] = projectID;
body['isDentalAllowedBackend'] = false;
await baseAppClient.post(SEND_ACTIVATION_CODE_FOR_ADVANCE_PAYMENT,
onSuccess: (response, statusCode) async {
logInTokenID = response['LogInTokenID'];
verificationCode = response['VerificationCode'];
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
super.error = error;
}, body: body);
}
checkActivationCodeForAdvancePayment({String activationCode}) async {
hasError = false;
super.error = "";
Map<String, dynamic> body = Map();
body['activationCode'] = activationCode;
body['PatientMobileNumber'] = 'XXXXXXXXXX';
body['isDentalAllowedBackend'] = false;
body['LogInTokenID'] = logInTokenID;
await baseAppClient.post(CHECK_ACTIVATION_CODE_FOR_ADVANCE_PAYMENT,
onSuccess: (response, statusCode) async {
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
super.error = error;
}, body: body);
}
getSharedRecordByStatus() async {
try {
var request = GetAllSharedRecordsByStatusReq();
request.status = 0;
await baseAppClient.post(GET_SHARED_RECORD_BY_STATUS,
onSuccess: (dynamic response, int statusCode) {
sharedPref.setObject(FAMILY_FILE, response);
getAllSharedRecordsByStatusResponse =
GetAllSharedRecordsByStatusResponse.fromJson(response);
}, onFailure: (String error, int statusCode) {
AppToast.showErrorToast(message: error);
hasError = true;
super.error = error;
}, body: request.toJson());
} catch (error) {
print(error);
hasError = true;
super.error = error;
}
}
getFamilyFiles() async {
if (await sharedPref.getObject(FAMILY_FILE) != null) {
getAllSharedRecordsByStatusResponse =
GetAllSharedRecordsByStatusResponse.fromJson(
await sharedPref.getObject(FAMILY_FILE));
return getAllSharedRecordsByStatusResponse;
} else {
return getSharedRecordByStatus();
}
}
}

@ -0,0 +1,116 @@
import 'package:diplomaticquarterapp/core/enum/viewstate.dart';
import 'package:diplomaticquarterapp/core/model/hospitals/hospitals_model.dart';
import 'package:diplomaticquarterapp/core/model/my_balance/patient_advance_balance_amount.dart';
import 'package:diplomaticquarterapp/core/model/my_balance/patient_info.dart';
import 'package:diplomaticquarterapp/core/model/my_balance/patient_info_and_mobile_number.dart';
import 'package:diplomaticquarterapp/core/service/hospital_service.dart';
import 'package:diplomaticquarterapp/core/service/medical/my_balance_service.dart';
import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart';
import 'package:diplomaticquarterapp/locator.dart';
import 'package:diplomaticquarterapp/models/FamilyFiles/GetAllSharedRecordByStatusResponse.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
class MyBalanceViewModel extends BaseViewModel {
MyBalanceService _myBalanceService = locator<MyBalanceService>();
HospitalService _hospitalService = locator<HospitalService>();
List<HospitalsModel> get hospitals => _hospitalService.hospitals;
List<PatientAdvanceBalanceAmount> get patientAdvanceBalanceAmountList =>
_myBalanceService.patientAdvanceBalanceAmountList;
double get totalAdvanceBalanceAmount =>
_myBalanceService.totalAdvanceBalanceAmount;
GetAllSharedRecordsByStatusResponse get getAllSharedRecordsByStatusResponse =>
_myBalanceService.getAllSharedRecordsByStatusResponse;
List<PatientInfo> get patientInfoList => _myBalanceService.patientInfoList;
PatientInfoAndMobileNumber get patientInfoAndMobileNumber =>
_myBalanceService.patientInfoAndMobileNumber;
String get logInTokenID => _myBalanceService.logInTokenID;
String get verificationCode => _myBalanceService.verificationCode;
getPatientAdvanceBalanceAmount() async {
setState(ViewState.Busy);
await _myBalanceService.getPatientAdvanceBalanceAmount();
if (_myBalanceService.hasError) {
error = _myBalanceService.error;
setState(ViewState.Error);
} else {
setState(ViewState.Idle);
}
}
Future getHospitals() async {
setState(ViewState.Busy);
await _hospitalService.getHospitals();
if (_hospitalService.hasError) {
error = _hospitalService.error;
setState(ViewState.Error);
} else
setState(ViewState.Idle);
}
Future getPatientInfoByPatientID({String id}) async {
setState(ViewState.Busy);
await _myBalanceService.getPatientInfoByPatientID(id: id);
if (_myBalanceService.hasError) {
error = _myBalanceService.error;
setState(ViewState.ErrorLocal);
AppToast.showErrorToast(message: error);
} else {
setState(ViewState.Idle);
}
}
Future getPatientInfoByPatientIDAndMobileNumber() async {
setState(ViewState.Busy);
await _myBalanceService.getPatientInfoByPatientIDAndMobileNumber();
if (_myBalanceService.hasError) {
error = _myBalanceService.error;
setState(ViewState.ErrorLocal);
AppToast.showErrorToast(message: error);
} else {
setState(ViewState.Idle);
}
}
Future sendActivationCodeForAdvancePayment({int patientID,int projectID}) async {
setState(ViewState.Busy);
await _myBalanceService.sendActivationCodeForAdvancePayment(patientID: patientID,projectID: projectID);
if (_myBalanceService.hasError) {
error = _myBalanceService.error;
setState(ViewState.ErrorLocal);
AppToast.showErrorToast(message: error);
} else {
setState(ViewState.Idle);
}
}
Future checkActivationCodeForAdvancePayment({String activationCode}) async {
setState(ViewState.Busy);
await _myBalanceService.checkActivationCodeForAdvancePayment(activationCode: activationCode);
if (_myBalanceService.hasError) {
error = _myBalanceService.error;
setState(ViewState.ErrorLocal);
} else {
setState(ViewState.Idle);
}
}
Future getFamilyFiles() async {
setState(ViewState.Busy);
await _myBalanceService.getFamilyFiles();
if (_myBalanceService.hasError) {
error = _myBalanceService.error;
setState(ViewState.ErrorLocal);
AppToast.showErrorToast(message: error);
} else {
setState(ViewState.Idle);
}
}
}

@ -11,6 +11,7 @@ import 'core/service/hospital_service.dart';
import 'core/service/medical/PatientSickLeaveService.dart'; import 'core/service/medical/PatientSickLeaveService.dart';
import 'core/service/medical/labs_service.dart'; import 'core/service/medical/labs_service.dart';
import 'core/service/medical/medical_service.dart'; import 'core/service/medical/medical_service.dart';
import 'core/service/medical/my_balance_service.dart';
import 'core/service/medical/my_doctor_service.dart'; import 'core/service/medical/my_doctor_service.dart';
import 'core/service/medical/prescriptions_service.dart'; import 'core/service/medical/prescriptions_service.dart';
import 'core/service/medical/radiology_service.dart'; import 'core/service/medical/radiology_service.dart';
@ -23,6 +24,7 @@ import 'core/service/medical/reports_service.dart';
import 'core/viewModels/hospital_view_model.dart'; import 'core/viewModels/hospital_view_model.dart';
import 'core/viewModels/medical/labs_view_model.dart'; import 'core/viewModels/medical/labs_view_model.dart';
import 'core/viewModels/medical/medical_view_model.dart'; import 'core/viewModels/medical/medical_view_model.dart';
import 'core/viewModels/medical/my_balance_view_model.dart';
import 'core/viewModels/medical/my_doctor_view_model.dart'; import 'core/viewModels/medical/my_doctor_view_model.dart';
import 'core/viewModels/medical/patient_sick_leave_view_model.dart'; import 'core/viewModels/medical/patient_sick_leave_view_model.dart';
import 'core/viewModels/medical/prescriptions_view_model.dart'; import 'core/viewModels/medical/prescriptions_view_model.dart';
@ -62,6 +64,7 @@ void setupLocator() {
locator.registerLazySingleton(() => ReportsMonthlyService()); locator.registerLazySingleton(() => ReportsMonthlyService());
locator.registerLazySingleton(() => ErService()); locator.registerLazySingleton(() => ErService());
locator.registerLazySingleton(() => PatientSickLeaveService()); locator.registerLazySingleton(() => PatientSickLeaveService());
locator.registerLazySingleton(() => MyBalanceService());
/// View Model /// View Model
locator.registerFactory(() => HospitalViewModel()); locator.registerFactory(() => HospitalViewModel());
@ -82,5 +85,6 @@ void setupLocator() {
locator.registerFactory(() => ReportsMonthlyViewModel()); locator.registerFactory(() => ReportsMonthlyViewModel());
locator.registerFactory(() => NearHospitalViewModel()); locator.registerFactory(() => NearHospitalViewModel());
locator.registerFactory(() => PatientSickLeaveViewMode()); locator.registerFactory(() => PatientSickLeaveViewMode());
locator.registerFactory(() => MyBalanceViewModel());
} }

@ -68,7 +68,7 @@ class MyApp extends StatelessWidget {
errorColor: Color.fromRGBO(235, 80, 60, 1.0), errorColor: Color.fromRGBO(235, 80, 60, 1.0),
scaffoldBackgroundColor:Hexcolor('#E9E9E9'),// Colors.grey[100], scaffoldBackgroundColor:Hexcolor('#E9E9E9'),// Colors.grey[100],
textSelectionColor: Color.fromRGBO(80, 100, 253, 0.5), textSelectionColor: Color.fromRGBO(80, 100, 253, 0.5),
textSelectionHandleColor: Color.fromRGBO(80, 100, 253, 1.0), textSelectionHandleColor: Colors.grey,
canvasColor: Colors.white, canvasColor: Colors.white,
backgroundColor: Color.fromRGBO(255, 255, 255, 1), backgroundColor: Color.fromRGBO(255, 255, 255, 1),
highlightColor: Colors.grey[100].withOpacity(0.4), highlightColor: Colors.grey[100].withOpacity(0.4),
@ -77,7 +77,7 @@ class MyApp extends StatelessWidget {
bottomSheetTheme:BottomSheetThemeData( bottomSheetTheme:BottomSheetThemeData(
backgroundColor: Hexcolor('#E0E0E0') backgroundColor: Hexcolor('#E0E0E0')
) , ) ,
cursorColor: Color.fromRGBO(78, 62, 253, 1.0), cursorColor: Colors.grey,
iconTheme: IconThemeData(), iconTheme: IconThemeData(),
appBarTheme: AppBarTheme( appBarTheme: AppBarTheme(
color: Colors.grey[700], color: Colors.grey[700],

@ -0,0 +1,377 @@
import 'package:diplomaticquarterapp/core/enum/viewstate.dart';
import 'package:diplomaticquarterapp/core/model/hospitals/hospitals_model.dart';
import 'package:diplomaticquarterapp/core/model/my_balance/patient_info.dart';
import 'package:diplomaticquarterapp/core/viewModels/medical/my_balance_view_model.dart';
import 'package:diplomaticquarterapp/models/FamilyFiles/GetAllSharedRecordByStatusResponse.dart';
import 'package:diplomaticquarterapp/pages/ToDoList/payment_method_select.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/pages/medical/balance/dialogs/SelectHospitalDialog.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/utils.dart';
import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:smart_progress_bar/smart_progress_bar.dart';
import '../../../core/model/my_balance/AdvanceModel.dart';
import 'dialogs/ConfirmSMSDialog.dart';
import 'dialogs/SelectBeneficiaryDialog.dart';
import 'dialogs/SelectPatientFamilyDialog.dart';
import 'dialogs/SelectPatientInfoDialog.dart';
import 'confirm_payment_page.dart';
import 'new_text_Field.dart';
enum BeneficiaryType { MyAccount, MyFamilyFiles, OtherAccount, NON }
class AdvancePaymentPage extends StatefulWidget {
@override
_AdvancePaymentPageState createState() => _AdvancePaymentPageState();
}
class _AdvancePaymentPageState extends State<AdvancePaymentPage> {
TextEditingController _fileTextController = TextEditingController();
TextEditingController _notesTextController = TextEditingController();
BeneficiaryType beneficiaryType = BeneficiaryType.NON;
HospitalsModel _selectedHospital;
String amount = "";
String email;
PatientInfo _selectedPatientInfo;
GetAllSharedRecordsByStatusList selectedPatientFamily;
AdvanceModel advanceModel = AdvanceModel();
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return BaseView<MyBalanceViewModel>(
onModelReady: (model) => model.getHospitals(),
builder: (_, model, w) => AppScaffold(
isShowAppBar: true,
appBarTitle: 'Advance Payment',
body: SingleChildScrollView(
physics: ScrollPhysics(),
child: Container(
margin: EdgeInsets.all(12),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Texts(
'You can create and add an Advanced Payment for you account or other accounts.',
textAlign: TextAlign.center,
),
SizedBox(
height: 12,
),
InkWell(
onTap: () => confirmSelectBeneficiaryDialog(model),
child: Container(
padding: EdgeInsets.all(12),
width: double.infinity,
height: 65,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
color: Colors.white),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Texts(getBeneficiaryType()),
Icon(Icons.arrow_drop_down)
],
),
),
),
if (beneficiaryType == BeneficiaryType.MyFamilyFiles)
SizedBox(
height: 12,
),
if (beneficiaryType == BeneficiaryType.MyFamilyFiles)
InkWell(
onTap: () {
model.getFamilyFiles().then((value) {
confirmSelectFamilyDialog(model
.getAllSharedRecordsByStatusResponse
.getAllSharedRecordsByStatusList);
}).showProgressBar(
text: "Loading",
backgroundColor: Colors.blue.withOpacity(0.6));
},
child: Container(
padding: EdgeInsets.all(12),
width: double.infinity,
height: 65,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
color: Colors.white),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Texts(getFamilyMembersName()),
Icon(Icons.arrow_drop_down)
],
),
),
),
SizedBox(
height: 12,
),
NewTextFields(
hintText: 'File Number',
controller: _fileTextController,
),
if (beneficiaryType == BeneficiaryType.OtherAccount)
SizedBox(
height: 12,
),
if (beneficiaryType == BeneficiaryType.OtherAccount)
InkWell(
onTap: () {
if (_fileTextController.text.isNotEmpty)
model
.getPatientInfoByPatientID(
id: _fileTextController.text)
.then((value) {
confirmSelectPatientDialog(model.patientInfoList);
}).showProgressBar(
text: "Loading",
backgroundColor:
Colors.blue.withOpacity(0.6));
else
AppToast.showErrorToast(
message: 'Please Enter The File Number');
},
child: Container(
padding: EdgeInsets.all(12),
width: double.infinity,
height: 65,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
color: Colors.white),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Texts(getPatientName()),
Icon(Icons.arrow_drop_down)
],
),
),
),
SizedBox(
height: 12,
),
InkWell(
onTap: () => confirmSelectHospitalDialog(model.hospitals),
child: Container(
padding: EdgeInsets.all(12),
width: double.infinity,
height: 65,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
color: Colors.white),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Texts(getHospitalName()),
Icon(Icons.arrow_drop_down)
],
),
),
),
SizedBox(
height: 12,
),
NewTextFields(
hintText: 'Amount*',
keyboardType: TextInputType.number,
onChanged: (value) {
setState(() {
amount = value;
});
},
),
SizedBox(
height: 12,
),
NewTextFields(
hintText: 'Depositor Email*',
initialValue: model.user.emailAddress,
onChanged: (value) {
email = value;
},
),
SizedBox(
height: 12,
),
NewTextFields(
hintText: 'Notes',
controller: _notesTextController,
),
SizedBox(
height: MediaQuery.of(context).size.height * 0.15,
)
],
),
),
),
bottomSheet: Container(
height: MediaQuery.of(context).size.height * 0.1,
width: double.infinity,
padding: EdgeInsets.all(12),
child: SecondaryButton(
textColor: Colors.white,
label: 'Submit',
disabled: amount.isEmpty ||
_fileTextController.text.isEmpty ||
_selectedHospital == null,
onTap: () {
advanceModel.fileNumber = _fileTextController.text;
advanceModel.hospitalsModel = _selectedHospital;
advanceModel.note = _notesTextController.text;
advanceModel.email = email ?? model.user.emailAddress;
advanceModel.amount = amount;
model.getPatientInfoByPatientIDAndMobileNumber().then((value) {
if (model.state != ViewState.Error &&
model.state != ViewState.ErrorLocal) {
Utils.hideKeyboard(context);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => PaymentMethod())).then(
(value) {
Navigator.push(
context,
FadePage(
page: ConfirmPaymentPage(
advanceModel: advanceModel,
selectedPaymentMethod: value,
patientInfoAndMobileNumber:
model.patientInfoAndMobileNumber,
),
),
);
},
);
}
}).showProgressBar(
text: "Loading",
backgroundColor: Colors.blue.withOpacity(0.6));
},
),
)),
);
}
void confirmSelectBeneficiaryDialog(MyBalanceViewModel model) {
showDialog(
context: context,
child: SelectBeneficiaryDialog(
beneficiaryType: beneficiaryType,
onValueSelected: (value) {
setState(() {
if (value == BeneficiaryType.MyAccount) {
_fileTextController.text = model.user.patientID.toString();
advanceModel.depositorName =
model.user.firstName + " " + model.user.lastName;
} else
_fileTextController.text = "";
beneficiaryType = value;
});
},
),
);
}
void confirmSelectHospitalDialog(List<HospitalsModel> hospitals) {
showDialog(
context: context,
child: SelectHospitalDialog(
hospitals: hospitals,
selectedHospital: _selectedHospital,
onValueSelected: (value) {
setState(() {
_selectedHospital = value;
});
},
),
);
}
void confirmSelectPatientDialog(List<PatientInfo> patientInfoList) {
showDialog(
context: context,
child: SelectPatientInfoDialog(
patientInfoList: patientInfoList,
selectedPatientInfo: _selectedPatientInfo,
onValueSelected: (value) {
setState(() {
advanceModel.depositorName = value.fullName;
_selectedPatientInfo = value;
});
},
),
);
}
void confirmSelectFamilyDialog(
List<GetAllSharedRecordsByStatusList> getAllSharedRecordsByStatusList) {
showDialog(
context: context,
child: SelectPatientFamilyDialog(
getAllSharedRecordsByStatusList: getAllSharedRecordsByStatusList,
selectedPatientFamily: selectedPatientFamily,
onValueSelected: (value) {
setState(() {
selectedPatientFamily = value;
_fileTextController.text = selectedPatientFamily.patientID.toString();
advanceModel.depositorName = value.patientName;
});
},
),
);
}
String getBeneficiaryType() {
switch (beneficiaryType) {
case BeneficiaryType.MyAccount:
return "My Account";
case BeneficiaryType.MyFamilyFiles:
return "My Family Files";
break;
case BeneficiaryType.OtherAccount:
return "Other Account";
break;
case BeneficiaryType.NON:
return "Select Beneficiary";
}
return "";
}
String getHospitalName() {
if (_selectedHospital != null)
return _selectedHospital.name;
else
return "Select Hospital";
}
String getPatientName() {
if (_selectedPatientInfo != null)
return _selectedPatientInfo.fullName;
else
return "Select Patient Name";
}
String getFamilyMembersName() {
if (selectedPatientFamily != null)
return selectedPatientFamily.patientName;
else
return "Select Patient Name";
}
}

@ -0,0 +1,176 @@
import 'package:diplomaticquarterapp/core/enum/viewstate.dart';
import 'package:diplomaticquarterapp/core/model/my_balance/patient_info_and_mobile_number.dart';
import 'package:diplomaticquarterapp/core/viewModels/medical/my_balance_view_model.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/core/model/my_balance/AdvanceModel.dart';
import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'dialogs/ConfirmSMSDialog.dart';
import 'new_text_Field.dart';
import 'package:smart_progress_bar/smart_progress_bar.dart';
class ConfirmPaymentPage extends StatelessWidget {
final AdvanceModel advanceModel;
final PatientInfoAndMobileNumber patientInfoAndMobileNumber;
final String selectedPaymentMethod;
ConfirmPaymentPage(
{this.advanceModel,
this.patientInfoAndMobileNumber,
this.selectedPaymentMethod});
@override
Widget build(BuildContext context) {
void showSMSDialog() {
showDialog(
context: context,
barrierDismissible: false,
child: ConfirmSMSDialog(
phoneNumber: patientInfoAndMobileNumber.mobileNumber,
),
);
}
return BaseView<MyBalanceViewModel>(
builder: (_, model, w) => AppScaffold(
isShowAppBar: true,
appBarTitle: 'Advance Payment',
body: SingleChildScrollView(
physics: ScrollPhysics(),
child: Container(
margin: EdgeInsets.all(12),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Texts(
'Confirm the Payment',
textAlign: TextAlign.center,
fontWeight: FontWeight.w500,
fontSize: 24,
),
SizedBox(
height: 12,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Container(
height: 100.0,
padding: EdgeInsets.all(7.0),
width: MediaQuery.of(context).size.width * 0.45,
child: Image.asset(getImagePath(selectedPaymentMethod)),
),
Texts(
'${advanceModel.amount} SAR',
fontSize: 26,
bold: true,
)
],
),
SizedBox(
height: 12,
),
Row(
children: [
Expanded(
child: Container(
margin: EdgeInsets.all(3),
child: NewTextFields(
hintText: 'File Number',
initialValue: advanceModel.fileNumber,
isEnabled: false,
),
),
),
Expanded(
child: Container(
margin: EdgeInsets.all(3),
child: NewTextFields(
hintText: 'Name',
initialValue: patientInfoAndMobileNumber.firstName,
isEnabled: false,
),
),
),
],
),
SizedBox(
height: 12,
),
NewTextFields(
hintText: 'Mobile Number',
initialValue: patientInfoAndMobileNumber.mobileNumber,
isEnabled: false,
),
SizedBox(
height: 12,
),
NewTextFields(
hintText: 'Depositor Name',
initialValue: advanceModel.depositorName,
isEnabled: false,
),
SizedBox(
height: 12,
),
NewTextFields(
hintText: 'Note',
initialValue: advanceModel.note,
isEnabled: false,
),
],
),
),
),
bottomSheet: Container(
height: MediaQuery.of(context).size.height * 0.1,
width: double.infinity,
padding: EdgeInsets.all(12),
child: SecondaryButton(
textColor: Colors.white,
label: 'CONFIRM',
disabled: model.state == ViewState.Busy,
onTap: () {
model
.sendActivationCodeForAdvancePayment(
patientID: int.parse(advanceModel.fileNumber),projectID: advanceModel.hospitalsModel.iD)
.then((value) {
if (model.state != ViewState.ErrorLocal &&
model.state != ViewState.Error) showSMSDialog();
}).showProgressBar(
text: "Loading",
backgroundColor: Colors.blue.withOpacity(0.6));
},
),
),
),
);
}
String getImagePath(String paymentMethod) {
switch (paymentMethod) {
case "MADA":
return 'assets/images/new-design/mada.png';
break;
case "SADAD":
return 'assets/images/new-design/sadad.png';
break;
case "VISA":
return 'assets/images/new-design/visa.png';
break;
case "MASTERCARD":
return 'assets/images/new-design/mastercard.png';
break;
case "Installment":
return 'assets/images/new-design/installment.png';
break;
}
return 'assets/images/new-design/mada.png';
}
}

@ -0,0 +1,363 @@
import 'dart:async';
import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/config/size_config.dart';
import 'package:diplomaticquarterapp/core/enum/viewstate.dart';
import 'package:diplomaticquarterapp/core/model/my_balance/AdvanceModel.dart';
import 'package:diplomaticquarterapp/core/model/my_balance/patient_info_and_mobile_number.dart';
import 'package:diplomaticquarterapp/core/viewModels/medical/my_balance_view_model.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:smart_progress_bar/smart_progress_bar.dart';
class ConfirmSMSDialog extends StatefulWidget {
final String phoneNumber;
final AdvanceModel advanceModel;
final PatientInfoAndMobileNumber patientInfoAndMobileNumber;
final String selectedPaymentMethod;
const ConfirmSMSDialog({Key key, this.phoneNumber,this.advanceModel,this.selectedPaymentMethod,this.patientInfoAndMobileNumber})
: super(key: key);
@override
_ConfirmSMSDialogState createState() => _ConfirmSMSDialogState();
}
class _ConfirmSMSDialogState extends State<ConfirmSMSDialog> {
final verifyAccountForm = GlobalKey<FormState>();
Map verifyAccountFormValue = {
'digit1': null,
'digit2': null,
'digit3': null,
'digit4': null,
};
TextEditingController digit1 = TextEditingController(text: "");
TextEditingController digit2 = TextEditingController(text: "");
TextEditingController digit3 = TextEditingController(text: "");
TextEditingController digit4 = TextEditingController(text: "");
String timerText = (TIMER_MIN - 1).toString() + ':59';
int min = TIMER_MIN - 1;
int sec = 59;
Timer _timer;
resendCode() {
min = TIMER_MIN - 1;
sec = 59;
_timer = Timer.periodic(Duration(seconds: 1), (Timer timer) {
if (min <= 0 && sec <= 0) {
timer.cancel();
} else {
setState(() {
sec = sec - 1;
if (sec == 0 && min == 0) {
Navigator.pop(context);
min = 0;
sec = 0;
} else if (sec == 0) {
min = min - 1;
sec = 59;
}
timerText = min.toString() + ':' + sec.toString();
});
}
});
}
FocusNode focusD1;
FocusNode focusD2;
FocusNode focusD3;
FocusNode focusD4;
@override
void initState() {
super.initState();
resendCode();
focusD1 = FocusNode();
focusD2 = FocusNode();
focusD3 = FocusNode();
focusD4 = FocusNode();
}
@override
void dispose() {
_timer.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return BaseView<MyBalanceViewModel>(
builder: (_, model, w) => Dialog(
elevation: 0.6,
child: Container(
height: 520,
child: ListView(
children: [
Container(
width: double.infinity,
height: 40,
color: Colors.grey[700],
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
flex: 4,
child: Center(
child: Texts(
'SMS',
color: Colors.white,
textAlign: TextAlign.center,
))),
Expanded(
flex: 1,
child: InkWell(
onTap: () => Navigator.pop(context),
child: Container(
decoration: BoxDecoration(
shape: BoxShape.circle, color: Colors.white),
child: Icon(
Icons.clear,
color: Colors.grey[900],
)),
),
)
],
),
),
Image.asset(
'assets/images/login/103.png',
height: MediaQuery.of(context).size.width * 0.25,
width: MediaQuery.of(context).size.width * 0.25,
),
SizedBox(
height: 12,
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Texts(
'Please enter the Verification code send to [${widget.phoneNumber}]',
textAlign: TextAlign.center,
),
),
SizedBox(
height: 12,
),
Form(
key: verifyAccountForm,
child: Container(
width: SizeConfig.realScreenWidth * 0.90,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
SizedBox(
height: 30,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
Container(
width: 65,
child: TextFormField(
textInputAction: TextInputAction.next,
style: TextStyle(
fontSize: SizeConfig.textMultiplier * 3,
),
focusNode: focusD1,
maxLength: 1,
controller: digit1,
textAlign: TextAlign.center,
keyboardType: TextInputType.number,
decoration: buildInputDecoration(context),
onSaved: (val) {
verifyAccountFormValue['digit1'] = val;
},
validator: validateCodeDigit,
onFieldSubmitted: (_) {
FocusScope.of(context).requestFocus(focusD2);
},
onChanged: (val) {
if (val.length == 1) {
FocusScope.of(context).requestFocus(focusD2);
}
},
),
),
Container(
width: 65,
child: TextFormField(
focusNode: focusD2,
controller: digit2,
textInputAction: TextInputAction.next,
maxLength: 1,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: SizeConfig.textMultiplier * 3,
),
keyboardType: TextInputType.number,
decoration: buildInputDecoration(context),
validator: validateCodeDigit,
onSaved: (val) {
verifyAccountFormValue['digit2'] = val;
},
onFieldSubmitted: (_) {
FocusScope.of(context).requestFocus(focusD3);
},
onChanged: (val) {
if (val.length == 1) {
FocusScope.of(context).requestFocus(focusD3);
}
},
),
),
Container(
width: 65,
child: TextFormField(
focusNode: focusD3,
controller: digit3,
textInputAction: TextInputAction.next,
maxLength: 1,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: SizeConfig.textMultiplier * 3,
),
keyboardType: TextInputType.number,
decoration: buildInputDecoration(context),
validator: validateCodeDigit,
onSaved: (val) {
verifyAccountFormValue['digit3'] = val;
},
onFieldSubmitted: (_) {
FocusScope.of(context).requestFocus(focusD4);
},
onChanged: (val) {
if (val.length == 1) {
FocusScope.of(context)
.requestFocus(focusD4);
}
},
)),
Container(
width: 65,
child: TextFormField(
focusNode: focusD4,
controller: digit4,
maxLength: 1,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: SizeConfig.textMultiplier * 3,
),
keyboardType: TextInputType.number,
decoration: buildInputDecoration(context),
validator: validateCodeDigit,
onSaved: (val) {
verifyAccountFormValue['digit4'] = val;
},
onFieldSubmitted: (_) {
FocusScope.of(context).requestFocus(focusD4);
submit(model);
},
onChanged: (val) {
if (val.length == 1) {
FocusScope.of(context)
.requestFocus(focusD4);
submit(model);
}
}),
)
],
),
SizedBox(
height: 8,
),
if (model.state == ViewState.ErrorLocal ||
model.state == ViewState.Error)
Container(
margin: EdgeInsets.only(left: 8,right: 8),
width: double.maxFinite,
child: Texts(
model.error,
color: Colors.red,
),
),
SizedBox(height: 20),
// buildText(),
Padding(
padding: const EdgeInsets.all(8.0),
child: Texts(
'The verification code expires in $timerText',
textAlign: TextAlign.center,
),
),
SizedBox(height: 20),
Container(
width: double.maxFinite,
padding: EdgeInsets.all(12),
child: SecondaryButton(
textColor: Colors.white,
label: 'SUBMIT',
onTap: () {
submit(model);
},
),
),
],
),
),
)
],
),
),
),
);
}
void submit(MyBalanceViewModel model) {
if (verifyAccountForm.currentState.validate()) {
final activationCode =
digit1.text + digit2.text + digit3.text + digit4.text;
model.checkActivationCodeForAdvancePayment(
activationCode: activationCode).then((value) {
//TODO complete payment
}).showProgressBar(
text: "Loading",
backgroundColor: Colors.blue.withOpacity(0.6));
}
}
String validateCodeDigit(value) {
if (value.isEmpty) {
return 'Please enter your Password';
}
return null;
}
InputDecoration buildInputDecoration(BuildContext context) {
return InputDecoration(
// ts/images/password_icon.png
contentPadding: EdgeInsets.only(top: 20, bottom: 20),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(5)),
borderSide: BorderSide(color: Colors.black),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(5.0)),
borderSide: BorderSide(color: Theme.of(context).primaryColor),
),
errorBorder: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(5.0)),
borderSide: BorderSide(color: Theme.of(context).errorColor),
),
focusedErrorBorder: OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(5.0)),
borderSide: BorderSide(color: Theme.of(context).errorColor),
),
);
}
}

@ -0,0 +1,175 @@
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import '../advance_payment_page.dart';
class SelectBeneficiaryDialog extends StatefulWidget {
final BeneficiaryType beneficiaryType;
final Function(BeneficiaryType) onValueSelected;
SelectBeneficiaryDialog(
{Key key, this.beneficiaryType, this.onValueSelected});
@override
_SelectBeneficiaryDialogState createState() =>
_SelectBeneficiaryDialogState(this.beneficiaryType);
}
class _SelectBeneficiaryDialogState extends State<SelectBeneficiaryDialog> {
_SelectBeneficiaryDialogState(this.beneficiaryType);
BeneficiaryType beneficiaryType;
@override
Widget build(BuildContext context) {
return SimpleDialog(
children: [
Container(
child: Column(
children: [
Divider(),
Row(
children: <Widget>[
Expanded(
flex: 1,
child: InkWell(
onTap: () {
setState(() {
beneficiaryType = BeneficiaryType.MyAccount;
});
},
child: ListTile(
title: const Text('My Account'),
leading: Radio(
value: BeneficiaryType.MyAccount,
groupValue: beneficiaryType,
activeColor: Colors.red[800],
onChanged: (BeneficiaryType value) {
setState(() {
beneficiaryType = value;
});
},
),
),
),
)
],
),
SizedBox(
height: 5.0,
),
Row(
children: <Widget>[
Expanded(
flex: 1,
child: InkWell(
onTap: () {
setState(() {
beneficiaryType = BeneficiaryType.MyFamilyFiles;
});
},
child: ListTile(
title: const Text('My Family Files'),
leading: Radio(
value: BeneficiaryType.MyFamilyFiles,
groupValue: beneficiaryType,
activeColor: Colors.red[800],
onChanged: (BeneficiaryType value) {
setState(() {
beneficiaryType = value;
});
},
),
),
),
)
],
),
SizedBox(
height: 5.0,
),
Row(
children: <Widget>[
Expanded(
flex: 1,
child: InkWell(
onTap: () {
setState(() {
beneficiaryType = BeneficiaryType.OtherAccount;
});
},
child: ListTile(
title: const Text('Other Account'),
leading: Radio(
value: BeneficiaryType.OtherAccount,
groupValue: beneficiaryType,
activeColor: Colors.red[800],
onChanged: (BeneficiaryType value) {
setState(() {
beneficiaryType = value;
});
},
),
),
),
)
],
),
SizedBox(
height: 5.0,
),
Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Expanded(
flex: 1,
child: InkWell(
onTap: () {
Navigator.pop(context);
},
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
child: Center(
child: Texts(
'CANCEL',
color: Colors.red,
),
),
),
),
),
),
Container(
width: 1,
height: 30,
color: Colors.grey[500],
),
Expanded(
flex: 1,
child: InkWell(
onTap: () {
widget.onValueSelected(beneficiaryType);
Navigator.pop(context);
},
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Center(
child: Texts(
'Ok',
fontWeight: FontWeight.w400,
),
),
),
),
),
],
)
],
),
)
],
);
}
}

@ -0,0 +1,128 @@
import 'package:diplomaticquarterapp/core/model/hospitals/hospitals_model.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class SelectHospitalDialog extends StatefulWidget {
final List<HospitalsModel> hospitals;
final Function(HospitalsModel) onValueSelected;
HospitalsModel selectedHospital;
SelectHospitalDialog(
{Key key, this.hospitals, this.onValueSelected, this.selectedHospital});
@override
_SelectHospitalDialogState createState() => _SelectHospitalDialogState();
}
class _SelectHospitalDialogState extends State<SelectHospitalDialog> {
@override
void initState() {
super.initState();
widget.selectedHospital = widget.selectedHospital ?? widget.hospitals[0];
}
@override
Widget build(BuildContext context) {
return SimpleDialog(
children: [
Column(
children: [
Divider(),
...List.generate(
widget.hospitals.length,
(index) => Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
height: 2,
),
Row(
children: <Widget>[
Expanded(
flex: 1,
child: InkWell(
onTap: () {
setState(() {
widget.selectedHospital = widget.hospitals[index];
});
},
child: ListTile(
title: Text(widget.hospitals[index].name +
' ${widget.hospitals[index].distanceInKilometers} KM'),
leading: Radio(
value: widget.hospitals[index],
groupValue: widget.selectedHospital,
activeColor: Colors.red[800],
onChanged: (value) {
setState(() {
widget.selectedHospital = value;
});
},
),
),
),
)
],
),
SizedBox(
height: 5.0,
),
],
),
),
SizedBox(
height: 5.0,
),
Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Expanded(
flex: 1,
child: InkWell(
onTap: () {
Navigator.pop(context);
},
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
child: Center(
child: Texts(
'CANCEL',
color: Colors.red,
),
),
),
),
),
),
Container(
width: 1,
height: 30,
color: Colors.grey[500],
),
Expanded(
flex: 1,
child: InkWell(
onTap: () {
widget.onValueSelected(widget.selectedHospital);
Navigator.pop(context);
},
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Center(
child: Texts(
'Ok',
fontWeight: FontWeight.w400,
)),
),
),
),
],
)
],
)
],
);
}
}

@ -0,0 +1,129 @@
import 'package:diplomaticquarterapp/core/model/hospitals/hospitals_model.dart';
import 'package:diplomaticquarterapp/core/model/my_balance/patient_info.dart';
import 'package:diplomaticquarterapp/models/FamilyFiles/GetAllSharedRecordByStatusResponse.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class SelectPatientFamilyDialog extends StatefulWidget {
final List<GetAllSharedRecordsByStatusList> getAllSharedRecordsByStatusList;
final Function(GetAllSharedRecordsByStatusList) onValueSelected;
GetAllSharedRecordsByStatusList selectedPatientFamily;
SelectPatientFamilyDialog({Key key, this.getAllSharedRecordsByStatusList, this.onValueSelected,this.selectedPatientFamily});
@override
_SelectPatientFamilyDialogState createState() => _SelectPatientFamilyDialogState();
}
class _SelectPatientFamilyDialogState extends State<SelectPatientFamilyDialog> {
@override
void initState() {
super.initState();
widget.selectedPatientFamily = widget.selectedPatientFamily?? widget.getAllSharedRecordsByStatusList[0];
}
@override
Widget build(BuildContext context) {
return SimpleDialog(
children: [
Column(
children: [
Divider(),
...List.generate(
widget.getAllSharedRecordsByStatusList.length,
(index) => Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
height: 2,
),
Row(
children: <Widget>[
Expanded(
flex: 1,
child: InkWell(
onTap: () {
setState(() {
widget.selectedPatientFamily = widget.getAllSharedRecordsByStatusList[index];
});
},
child: ListTile(
title: Text(widget.getAllSharedRecordsByStatusList[index].patientName),
leading: Radio(
value: widget.getAllSharedRecordsByStatusList[index],
groupValue: widget.selectedPatientFamily,
activeColor: Colors.red[800],
onChanged: (value) {
setState(() {
widget.selectedPatientFamily = value;
});
},
),
),
),
)
],
),
SizedBox(
height: 5.0,
),
],
),
),
SizedBox(
height: 5.0,
),
Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Expanded(
flex: 1,
child: InkWell(
onTap: () {
Navigator.pop(context);
},
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
child: Center(
child: Texts(
'CANCEL',
color: Colors.red,
),
),
),
),
),
),
Container(
width: 1,
height: 30,
color: Colors.grey[500],
),
Expanded(
flex: 1,
child: InkWell(
onTap: () {
widget.onValueSelected(widget.selectedPatientFamily);
Navigator.pop(context);
},
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Center(
child: Texts(
'Ok',
fontWeight: FontWeight.w400,
)),
),
),
),
],
)
],
)
],
);
}
}

@ -0,0 +1,129 @@
import 'package:diplomaticquarterapp/core/model/hospitals/hospitals_model.dart';
import 'package:diplomaticquarterapp/core/model/my_balance/patient_info.dart';
import 'package:diplomaticquarterapp/models/FamilyFiles/GetAllSharedRecordByStatusResponse.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class SelectPatientInfoDialog extends StatefulWidget {
final List<PatientInfo> patientInfoList ;
final Function(PatientInfo) onValueSelected;
PatientInfo selectedPatientInfo;
SelectPatientInfoDialog({Key key, this.patientInfoList, this.onValueSelected,this.selectedPatientInfo});
@override
_SelectPatientInfoDialogState createState() => _SelectPatientInfoDialogState();
}
class _SelectPatientInfoDialogState extends State<SelectPatientInfoDialog> {
@override
void initState() {
super.initState();
widget.selectedPatientInfo = widget.selectedPatientInfo?? widget.patientInfoList[0];
}
@override
Widget build(BuildContext context) {
return SimpleDialog(
children: [
Column(
children: [
Divider(),
...List.generate(
widget.patientInfoList.length,
(index) => Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
height: 2,
),
Row(
children: <Widget>[
Expanded(
flex: 1,
child: InkWell(
onTap: () {
setState(() {
widget.selectedPatientInfo = widget.patientInfoList[index];
});
},
child: ListTile(
title: Text(widget.patientInfoList[index].fullName),
leading: Radio(
value: widget.patientInfoList[index],
groupValue: widget.selectedPatientInfo,
activeColor: Colors.red[800],
onChanged: (value) {
setState(() {
widget.selectedPatientInfo = value;
});
},
),
),
),
)
],
),
SizedBox(
height: 5.0,
),
],
),
),
SizedBox(
height: 5.0,
),
Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Expanded(
flex: 1,
child: InkWell(
onTap: () {
Navigator.pop(context);
},
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
child: Center(
child: Texts(
'CANCEL',
color: Colors.red,
),
),
),
),
),
),
Container(
width: 1,
height: 30,
color: Colors.grey[500],
),
Expanded(
flex: 1,
child: InkWell(
onTap: () {
widget.onValueSelected(widget.selectedPatientInfo);
Navigator.pop(context);
},
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Center(
child: Texts(
'Ok',
fontWeight: FontWeight.w400,
)),
),
),
),
],
)
],
)
],
);
}
}

@ -0,0 +1,89 @@
import 'dart:async';
import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/config/size_config.dart';
import 'package:flutter/material.dart';
import 'package:hexcolor/hexcolor.dart';
import 'package:provider/provider.dart';
class ShowTimerText extends StatefulWidget {
ShowTimerText({Key key, this.model});
final model;
@override
_ShowTimerTextState createState() => _ShowTimerTextState();
}
class _ShowTimerTextState extends State<ShowTimerText> {
String timerText = (TIMER_MIN - 1).toString() + ':59';
int min = TIMER_MIN - 1;
int sec = 59;
Timer _timer;
// AuthProvider authProv;
resendCode() {
min = TIMER_MIN - 1;
sec = 59;
_timer = Timer.periodic(Duration(seconds: 1), (Timer timer) {
if (min <= 0 && sec <= 0) {
timer.cancel();
} else {
setState(() {
sec = sec - 1;
if (sec == 0 && min == 0) {
//TODO
min = 0;
sec = 0;
} else if (sec == 0) {
min = min - 1;
sec = 59;
}
timerText = min.toString() + ':' + sec.toString();
});
}
});
}
@override
void initState() {
super.initState();
resendCode();
}
@override
void dispose() {
_timer.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Center(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
InkWell(
onTap: min != 0 || sec != 0
? null
: () {
resendActivatioinCode();
},
child: Text(
timerText,
style: TextStyle(
fontSize: 3.0 * SizeConfig.textMultiplier,
color: Hexcolor('#B8382C'),
fontWeight: FontWeight.bold),
),
),
],
),
);
}
resendActivatioinCode() {
}
}

@ -0,0 +1,106 @@
import 'package:diplomaticquarterapp/core/viewModels/medical/my_balance_view_model.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart';
import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:hexcolor/hexcolor.dart';
import 'advance_payment_page.dart';
class MyBalancePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BaseView<MyBalanceViewModel>(
onModelReady: (model) => model.getPatientAdvanceBalanceAmount(),
builder: (_, model, w) => AppScaffold(
baseViewModel: model,
isShowAppBar: true,
appBarTitle: 'My Balances',
body: Container(
margin: EdgeInsets.all(12),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Texts(
'Balance Amount',
color: Colors.black,
bold: true,
),
SizedBox(
height: 15,
),
Container(
padding: EdgeInsets.all(8),
width: double.infinity,
height: 65,
decoration: BoxDecoration(
color: Hexcolor('#B61422'),
shape: BoxShape.rectangle,
borderRadius: BorderRadius.circular(7),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Texts(
'Total Balance',
color: Colors.white,
),
Texts(
'${model.totalAdvanceBalanceAmount ?? 0} SAR',
color: Colors.white,
bold: true,
),
],
),
),
SizedBox(
height: 9,
),
...List.generate(
model.patientAdvanceBalanceAmountList.length,
(index) => Container(
padding: EdgeInsets.all(8),
height: 65,
margin: EdgeInsets.only(top: 8),
decoration: BoxDecoration(
color: Colors.white,
shape: BoxShape.rectangle,
borderRadius: BorderRadius.circular(7),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Texts(model.patientAdvanceBalanceAmountList[index]
.projectDescription),
Texts(
'${model.patientAdvanceBalanceAmountList[index].patientAdvanceBalanceAmount} SAR',
bold: true,
),
],
),
),
),
],
),
),
bottomSheet: Container(
height: MediaQuery.of(context).size.height * 0.1,
width: double.infinity,
padding: EdgeInsets.all(12),
child: SecondaryButton(
// color: Colors.grey[900],
textColor: Colors.white,
label: ' Create Advanced Payment',
onTap: () {
Navigator.push(context,
FadePage(page: AdvancePaymentPage()));
},
),
),
),
);
}
}

@ -0,0 +1,239 @@
import 'package:eva_icons_flutter/eva_icons_flutter.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class NumberTextInputFormatter extends TextInputFormatter {
@override
TextEditingValue formatEditUpdate(
TextEditingValue oldValue, TextEditingValue newValue) {
final int newTextLength = newValue.text.length;
int selectionIndex = newValue.selection.end;
int usedSubstringIndex = 0;
final StringBuffer newText = StringBuffer();
if (newTextLength >= 1) {
newText.write('(');
if (newValue.selection.end >= 1) selectionIndex++;
}
if (newTextLength >= 4) {
newText.write(newValue.text.substring(0, usedSubstringIndex = 3) + ') ');
if (newValue.selection.end >= 3) selectionIndex += 2;
}
if (newTextLength >= 7) {
newText.write(newValue.text.substring(3, usedSubstringIndex = 6) + '-');
if (newValue.selection.end >= 6) selectionIndex++;
}
if (newTextLength >= 11) {
newText.write(newValue.text.substring(6, usedSubstringIndex = 10) + ' ');
if (newValue.selection.end >= 10) selectionIndex++;
}
// Dump the rest.
if (newTextLength >= usedSubstringIndex)
newText.write(newValue.text.substring(usedSubstringIndex));
return TextEditingValue(
text: newText.toString(),
selection: TextSelection.collapsed(offset: selectionIndex),
);
}
}
final _mobileFormatter = NumberTextInputFormatter();
class NewTextFields extends StatefulWidget {
NewTextFields(
{Key key,
this.type,
this.hintText,
this.suffixIcon,
this.autoFocus,
this.onChanged,
this.initialValue,
this.minLines,
this.maxLines,
this.inputFormatters,
this.padding,
this.focus = false,
this.maxLengthEnforced = true,
this.suffixIconColor,
this.inputAction,
this.onSubmit,
this.keepPadding = true,
this.textCapitalization = TextCapitalization.none,
this.controller,
this.keyboardType,
this.validator,
this.borderOnlyError = false,
this.onSaved,
this.onSuffixTap,
this.readOnly: false,
this.maxLength,
this.prefixIcon,
this.bare = false,
this.onTap,
this.fontSize = 16.0,
this.fontWeight = FontWeight.w700,
this.autoValidate = false,
this.hintColor,this.isEnabled=true})
: super(key: key);
final String hintText;
// final String initialValue;
final String type;
final bool autoFocus;
final IconData suffixIcon;
final Color suffixIconColor;
final Icon prefixIcon;
final VoidCallback onTap;
final TextEditingController controller;
final TextInputType keyboardType;
final FormFieldValidator validator;
final Function onSaved;
final Function onSuffixTap;
final Function onChanged;
final Function onSubmit;
final bool readOnly;
final int maxLength;
final int minLines;
final int maxLines;
final bool maxLengthEnforced;
final bool bare;
final bool isEnabled;
final TextInputAction inputAction;
final double fontSize;
final FontWeight fontWeight;
final bool keepPadding;
final TextCapitalization textCapitalization;
final List<TextInputFormatter> inputFormatters;
final bool autoValidate;
final EdgeInsets padding;
final bool focus;
final bool borderOnlyError;
final Color hintColor;
final String initialValue;
@override
_NewTextFieldsState createState() => _NewTextFieldsState();
}
class _NewTextFieldsState extends State<NewTextFields> {
final FocusNode _focusNode = FocusNode();
bool focus = false;
bool view = false;
@override
void initState() {
super.initState();
_focusNode.addListener(() {
setState(() {
focus = _focusNode.hasFocus;
});
});
}
@override
void didUpdateWidget(NewTextFields oldWidget) {
if (widget.focus) _focusNode.requestFocus();
super.didUpdateWidget(oldWidget);
}
@override
void dispose() {
_focusNode.dispose();
super.dispose();
}
bool _determineReadOnly() {
if (widget.readOnly != null && widget.readOnly) {
_focusNode.unfocus();
return true;
} else {
return false;
}
}
@override
Widget build(BuildContext context) {
return AnimatedContainer(
duration: Duration(milliseconds: 300),
decoration:BoxDecoration(
borderRadius: BorderRadius.circular(12),
color: Colors.white),
child: Container(
margin: EdgeInsets.only(top: 8),
child: TextFormField(
enabled: widget.isEnabled,
initialValue: widget.initialValue,
keyboardAppearance: Theme.of(context).brightness,
scrollPhysics: BouncingScrollPhysics(),
autovalidate: widget.autoValidate,
textCapitalization: widget.textCapitalization,
onFieldSubmitted: widget.inputAction == TextInputAction.next
? (widget.onSubmit != null
? widget.onSubmit
: (val) {
_focusNode.nextFocus();
})
: widget.onSubmit,
textInputAction: widget.inputAction,
minLines: widget.minLines ?? 1,
maxLines: widget.maxLines ?? 1,
maxLengthEnforced: widget.maxLengthEnforced,
onChanged: widget.onChanged,
focusNode: _focusNode,
maxLength: widget.maxLength ?? null,
controller: widget.controller,
keyboardType: widget.keyboardType,
readOnly: _determineReadOnly(),
obscureText: widget.type == "password" && !view ? true : false,
autofocus: widget.autoFocus ?? false,
validator: widget.validator,
onSaved: widget.onSaved,
style: Theme.of(context)
.textTheme
.body2
.copyWith(fontSize: widget.fontSize, fontWeight: widget.fontWeight),
inputFormatters: widget.keyboardType == TextInputType.phone
? <TextInputFormatter>[
WhitelistingTextInputFormatter.digitsOnly,
_mobileFormatter,
]
: widget.inputFormatters,
decoration: InputDecoration(
labelText: widget.hintText,
labelStyle: TextStyle(color: Colors.black),
errorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: Theme.of(context)
.errorColor
.withOpacity(0.5),
width: 1.0),
borderRadius: BorderRadius.circular(12.0)),
focusedErrorBorder: OutlineInputBorder(
borderSide: BorderSide(
color: Theme.of(context)
.errorColor
.withOpacity(0.5),
width: 1.0),
borderRadius: BorderRadius.circular(8.0)),
focusedBorder: OutlineInputBorder(
borderSide:
BorderSide(color: Colors.white, width: 1.0),
borderRadius: BorderRadius.circular(12)),
disabledBorder: OutlineInputBorder(
borderSide:
BorderSide(color: Colors.white, width: 1.0),
borderRadius: BorderRadius.circular(12)),
enabledBorder: OutlineInputBorder(
borderSide:
BorderSide(color: Colors.white, width: 1.0),
borderRadius: BorderRadius.circular(12),
),
),
),
),
);
}
}

@ -24,6 +24,7 @@ import 'package:flutter/material.dart';
import 'package:diplomaticquarterapp/pages/insurance/insurance_card_screen.dart'; import 'package:diplomaticquarterapp/pages/insurance/insurance_card_screen.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../../locator.dart'; import '../../locator.dart';
import 'balance/my_balance_page.dart';
import 'doctor/doctor_home_page.dart'; import 'doctor/doctor_home_page.dart';
import 'package:diplomaticquarterapp/pages/insurance/insurance_update_screen.dart'; import 'package:diplomaticquarterapp/pages/insurance/insurance_update_screen.dart';
import 'package:diplomaticquarterapp/pages/insurance/insurance_approval_screen.dart'; import 'package:diplomaticquarterapp/pages/insurance/insurance_approval_screen.dart';
@ -368,10 +369,10 @@ class _MedicalProfilePageState extends State<MedicalProfilePage> {
Expanded( Expanded(
flex: 1, flex: 1,
child: InkWell( child: InkWell(
// onTap: () { onTap: () {
// Navigator.push( Navigator.push(context,
// context, FadePage(page: InsuranceApproval())); FadePage(page: MyBalancePage()));
// }, },
child: MedicalProfileItem( child: MedicalProfileItem(
title: title:
TranslationBase.of(context).myBalance, TranslationBase.of(context).myBalance,

@ -41,6 +41,7 @@ class DoctorCard extends StatelessWidget {
borderRadius: BorderRadius.all( borderRadius: BorderRadius.all(
Radius.circular(8.0), Radius.circular(8.0),
), ),
color: Colors.white
), ),
child: InkWell( child: InkWell(
onTap: onTap, onTap: onTap,

Loading…
Cancel
Save