Merge branch 'development' of https://gitlab.com/Cloud_Solution/diplomatic-quarter into foote_in_all_pages
Conflicts: lib/pages/landing/landing_page.dartmerge-requests/369/head
commit
f85c359cf4
Binary file not shown.
After Width: | Height: | Size: 1.7 KiB |
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,107 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
|
import 'package:diplomaticquarterapp/uitl/utils.dart';
|
||||||
|
|
||||||
|
class DoctorPrePostImages {
|
||||||
|
DoctorPrePostImageModel pre;
|
||||||
|
DoctorPrePostImageModel post;
|
||||||
|
|
||||||
|
Uint8List getPreBytes(){
|
||||||
|
try{
|
||||||
|
var b64 = pre.imageStr.replaceFirst('data:image/png;base64,', '');
|
||||||
|
if(pre.imageStr != null && isBase64(b64))
|
||||||
|
return Utils.dataFromBase64String(b64);
|
||||||
|
}catch(e){
|
||||||
|
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Uint8List getPostBytes(){
|
||||||
|
try{
|
||||||
|
var b64 = post.imageStr.replaceFirst('data:image/png;base64,', '');
|
||||||
|
if(post.imageStr != null && isBase64(b64))
|
||||||
|
return Utils.dataFromBase64String(b64);
|
||||||
|
}catch(e){
|
||||||
|
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isBase64(String str) {
|
||||||
|
RegExp _base64 = RegExp(
|
||||||
|
r'^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{4})$');
|
||||||
|
return _base64.hasMatch(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class DoctorPrePostImageModel {
|
||||||
|
String setupID;
|
||||||
|
int projectID;
|
||||||
|
int clinicId;
|
||||||
|
int doctorId;
|
||||||
|
int lineItemNo;
|
||||||
|
String imageStr;
|
||||||
|
int imageType;
|
||||||
|
String description;
|
||||||
|
dynamic isNewUpdated;
|
||||||
|
bool isActive;
|
||||||
|
String createdOn;
|
||||||
|
int createdBy;
|
||||||
|
dynamic editedOn;
|
||||||
|
dynamic editedBy;
|
||||||
|
|
||||||
|
DoctorPrePostImageModel({
|
||||||
|
this.setupID,
|
||||||
|
this.projectID,
|
||||||
|
this.clinicId,
|
||||||
|
this.doctorId,
|
||||||
|
this.lineItemNo,
|
||||||
|
this.imageStr,
|
||||||
|
this.imageType,
|
||||||
|
this.description,
|
||||||
|
this.isNewUpdated,
|
||||||
|
this.isActive,
|
||||||
|
this.createdOn,
|
||||||
|
this.createdBy,
|
||||||
|
this.editedOn,
|
||||||
|
this.editedBy});
|
||||||
|
|
||||||
|
DoctorPrePostImageModel.fromJson(dynamic json) {
|
||||||
|
setupID = json["SetupID"];
|
||||||
|
projectID = json["ProjectID"];
|
||||||
|
clinicId = json["ClinicId"];
|
||||||
|
doctorId = json["DoctorId"];
|
||||||
|
lineItemNo = json["LineItemNo"];
|
||||||
|
imageStr = json["ImageStr"];
|
||||||
|
imageType = json["ImageType"];
|
||||||
|
description = json["Description"];
|
||||||
|
isNewUpdated = json["IsNewUpdated"];
|
||||||
|
isActive = json["IsActive"];
|
||||||
|
createdOn = json["CreatedOn"];
|
||||||
|
createdBy = json["CreatedBy"];
|
||||||
|
editedOn = json["EditedOn"];
|
||||||
|
editedBy = json["EditedBy"];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
var map = <String, dynamic>{};
|
||||||
|
map["SetupID"] = setupID;
|
||||||
|
map["ProjectID"] = projectID;
|
||||||
|
map["ClinicId"] = clinicId;
|
||||||
|
map["DoctorId"] = doctorId;
|
||||||
|
map["LineItemNo"] = lineItemNo;
|
||||||
|
map["ImageStr"] = imageStr;
|
||||||
|
map["ImageType"] = imageType;
|
||||||
|
map["Description"] = description;
|
||||||
|
map["IsNewUpdated"] = isNewUpdated;
|
||||||
|
map["IsActive"] = isActive;
|
||||||
|
map["CreatedOn"] = createdOn;
|
||||||
|
map["CreatedBy"] = createdBy;
|
||||||
|
map["EditedOn"] = editedOn;
|
||||||
|
map["EditedBy"] = editedBy;
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,489 @@
|
|||||||
|
class DentalInvoiceDetailResponse {
|
||||||
|
List<ListEInvoiceForDental> listEInvoiceForDental;
|
||||||
|
|
||||||
|
DentalInvoiceDetailResponse({this.listEInvoiceForDental});
|
||||||
|
|
||||||
|
DentalInvoiceDetailResponse.fromJson(Map<String, dynamic> json) {
|
||||||
|
if (json['List_eInvoiceForDental'] != null) {
|
||||||
|
listEInvoiceForDental = new List<ListEInvoiceForDental>();
|
||||||
|
json['List_eInvoiceForDental'].forEach((v) {
|
||||||
|
listEInvoiceForDental.add(new ListEInvoiceForDental.fromJson(v));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
if (this.listEInvoiceForDental != null) {
|
||||||
|
data['List_eInvoiceForDental'] =
|
||||||
|
this.listEInvoiceForDental.map((v) => v.toJson()).toList();
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ListEInvoiceForDental {
|
||||||
|
int projectID;
|
||||||
|
int doctorID;
|
||||||
|
dynamic grandTotal;
|
||||||
|
dynamic quantity;
|
||||||
|
dynamic total;
|
||||||
|
dynamic discount;
|
||||||
|
dynamic subTotal;
|
||||||
|
int invoiceNo;
|
||||||
|
String createdOn;
|
||||||
|
dynamic procedureID;
|
||||||
|
dynamic procedureName;
|
||||||
|
dynamic procedureNameN;
|
||||||
|
dynamic procedurePrice;
|
||||||
|
dynamic patientShare;
|
||||||
|
dynamic companyShare;
|
||||||
|
dynamic totalPatientShare;
|
||||||
|
dynamic totalCompanyShare;
|
||||||
|
dynamic totalShare;
|
||||||
|
dynamic discountAmount;
|
||||||
|
dynamic vATPercentage;
|
||||||
|
dynamic patientVATAmount;
|
||||||
|
dynamic companyVATAmount;
|
||||||
|
dynamic totalVATAmount;
|
||||||
|
dynamic price;
|
||||||
|
int patientID;
|
||||||
|
String patientName;
|
||||||
|
dynamic patientNameN;
|
||||||
|
String nationalityID;
|
||||||
|
String doctorName;
|
||||||
|
dynamic doctorNameN;
|
||||||
|
int clinicID;
|
||||||
|
String clinicDescription;
|
||||||
|
dynamic clinicDescriptionN;
|
||||||
|
String appointmentDate;
|
||||||
|
int appointmentNo;
|
||||||
|
String insuranceID;
|
||||||
|
int companyID;
|
||||||
|
String companyName;
|
||||||
|
dynamic companyNameN;
|
||||||
|
String companyAddress;
|
||||||
|
dynamic companyAddressN;
|
||||||
|
String companyGroupAddress;
|
||||||
|
String groupName;
|
||||||
|
dynamic groupNameN;
|
||||||
|
String patientAddress;
|
||||||
|
String vATNo;
|
||||||
|
String paymentDate;
|
||||||
|
String projectName;
|
||||||
|
dynamic totalDiscount;
|
||||||
|
dynamic totalPatientShareWithQuantity;
|
||||||
|
String legalName;
|
||||||
|
dynamic legalNameN;
|
||||||
|
dynamic advanceAdjustment;
|
||||||
|
String doctorImageURL;
|
||||||
|
List<ListConsultation> listConsultation;
|
||||||
|
|
||||||
|
ListEInvoiceForDental(
|
||||||
|
{this.projectID,
|
||||||
|
this.doctorID,
|
||||||
|
this.grandTotal,
|
||||||
|
this.quantity,
|
||||||
|
this.total,
|
||||||
|
this.discount,
|
||||||
|
this.subTotal,
|
||||||
|
this.invoiceNo,
|
||||||
|
this.createdOn,
|
||||||
|
this.procedureID,
|
||||||
|
this.procedureName,
|
||||||
|
this.procedureNameN,
|
||||||
|
this.procedurePrice,
|
||||||
|
this.patientShare,
|
||||||
|
this.companyShare,
|
||||||
|
this.totalPatientShare,
|
||||||
|
this.totalCompanyShare,
|
||||||
|
this.totalShare,
|
||||||
|
this.discountAmount,
|
||||||
|
this.vATPercentage,
|
||||||
|
this.patientVATAmount,
|
||||||
|
this.companyVATAmount,
|
||||||
|
this.totalVATAmount,
|
||||||
|
this.price,
|
||||||
|
this.patientID,
|
||||||
|
this.patientName,
|
||||||
|
this.patientNameN,
|
||||||
|
this.nationalityID,
|
||||||
|
this.doctorName,
|
||||||
|
this.doctorNameN,
|
||||||
|
this.clinicID,
|
||||||
|
this.clinicDescription,
|
||||||
|
this.clinicDescriptionN,
|
||||||
|
this.appointmentDate,
|
||||||
|
this.appointmentNo,
|
||||||
|
this.insuranceID,
|
||||||
|
this.companyID,
|
||||||
|
this.companyName,
|
||||||
|
this.companyNameN,
|
||||||
|
this.companyAddress,
|
||||||
|
this.companyAddressN,
|
||||||
|
this.companyGroupAddress,
|
||||||
|
this.groupName,
|
||||||
|
this.groupNameN,
|
||||||
|
this.patientAddress,
|
||||||
|
this.vATNo,
|
||||||
|
this.paymentDate,
|
||||||
|
this.projectName,
|
||||||
|
this.totalDiscount,
|
||||||
|
this.totalPatientShareWithQuantity,
|
||||||
|
this.legalName,
|
||||||
|
this.legalNameN,
|
||||||
|
this.advanceAdjustment,
|
||||||
|
this.doctorImageURL,
|
||||||
|
this.listConsultation});
|
||||||
|
|
||||||
|
ListEInvoiceForDental.fromJson(Map<String, dynamic> json) {
|
||||||
|
projectID = json['ProjectID'];
|
||||||
|
doctorID = json['DoctorID'];
|
||||||
|
grandTotal = json['GrandTotal'];
|
||||||
|
quantity = json['Quantity'];
|
||||||
|
total = json['Total'];
|
||||||
|
discount = json['Discount'];
|
||||||
|
subTotal = json['SubTotal'];
|
||||||
|
invoiceNo = json['InvoiceNo'];
|
||||||
|
createdOn = json['CreatedOn'];
|
||||||
|
procedureID = json['ProcedureID'];
|
||||||
|
procedureName = json['ProcedureName'];
|
||||||
|
procedureNameN = json['ProcedureNameN'];
|
||||||
|
procedurePrice = json['ProcedurePrice'];
|
||||||
|
patientShare = json['PatientShare'];
|
||||||
|
companyShare = json['CompanyShare'];
|
||||||
|
totalPatientShare = json['TotalPatientShare'];
|
||||||
|
totalCompanyShare = json['TotalCompanyShare'];
|
||||||
|
totalShare = json['TotalShare'];
|
||||||
|
discountAmount = json['DiscountAmount'];
|
||||||
|
vATPercentage = json['VATPercentage'];
|
||||||
|
patientVATAmount = json['PatientVATAmount'];
|
||||||
|
companyVATAmount = json['CompanyVATAmount'];
|
||||||
|
totalVATAmount = json['TotalVATAmount'];
|
||||||
|
price = json['Price'];
|
||||||
|
patientID = json['PatientID'];
|
||||||
|
patientName = json['PatientName'];
|
||||||
|
patientNameN = json['PatientNameN'];
|
||||||
|
nationalityID = json['NationalityID'];
|
||||||
|
doctorName = json['DoctorName'];
|
||||||
|
doctorNameN = json['DoctorNameN'];
|
||||||
|
clinicID = json['ClinicID'];
|
||||||
|
clinicDescription = json['ClinicDescription'];
|
||||||
|
clinicDescriptionN = json['ClinicDescriptionN'];
|
||||||
|
appointmentDate = json['AppointmentDate'];
|
||||||
|
appointmentNo = json['AppointmentNo'];
|
||||||
|
insuranceID = json['InsuranceID'];
|
||||||
|
companyID = json['CompanyID'];
|
||||||
|
companyName = json['CompanyName'];
|
||||||
|
companyNameN = json['CompanyNameN'];
|
||||||
|
companyAddress = json['CompanyAddress'];
|
||||||
|
companyAddressN = json['CompanyAddressN'];
|
||||||
|
companyGroupAddress = json['CompanyGroupAddress'];
|
||||||
|
groupName = json['GroupName'];
|
||||||
|
groupNameN = json['GroupNameN'];
|
||||||
|
patientAddress = json['PatientAddress'];
|
||||||
|
vATNo = json['VATNo'];
|
||||||
|
paymentDate = json['PaymentDate'];
|
||||||
|
projectName = json['ProjectName'];
|
||||||
|
totalDiscount = json['TotalDiscount'];
|
||||||
|
totalPatientShareWithQuantity = json['TotalPatientShareWithQuantity'];
|
||||||
|
legalName = json['LegalName'];
|
||||||
|
legalNameN = json['LegalNameN'];
|
||||||
|
advanceAdjustment = json['AdvanceAdjustment'];
|
||||||
|
doctorImageURL = json['DoctorImageURL'];
|
||||||
|
if (json['listConsultation'] != null) {
|
||||||
|
listConsultation = new List<ListConsultation>();
|
||||||
|
json['listConsultation'].forEach((v) {
|
||||||
|
listConsultation.add(new ListConsultation.fromJson(v));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
data['ProjectID'] = this.projectID;
|
||||||
|
data['DoctorID'] = this.doctorID;
|
||||||
|
data['GrandTotal'] = this.grandTotal;
|
||||||
|
data['Quantity'] = this.quantity;
|
||||||
|
data['Total'] = this.total;
|
||||||
|
data['Discount'] = this.discount;
|
||||||
|
data['SubTotal'] = this.subTotal;
|
||||||
|
data['InvoiceNo'] = this.invoiceNo;
|
||||||
|
data['CreatedOn'] = this.createdOn;
|
||||||
|
data['ProcedureID'] = this.procedureID;
|
||||||
|
data['ProcedureName'] = this.procedureName;
|
||||||
|
data['ProcedureNameN'] = this.procedureNameN;
|
||||||
|
data['ProcedurePrice'] = this.procedurePrice;
|
||||||
|
data['PatientShare'] = this.patientShare;
|
||||||
|
data['CompanyShare'] = this.companyShare;
|
||||||
|
data['TotalPatientShare'] = this.totalPatientShare;
|
||||||
|
data['TotalCompanyShare'] = this.totalCompanyShare;
|
||||||
|
data['TotalShare'] = this.totalShare;
|
||||||
|
data['DiscountAmount'] = this.discountAmount;
|
||||||
|
data['VATPercentage'] = this.vATPercentage;
|
||||||
|
data['PatientVATAmount'] = this.patientVATAmount;
|
||||||
|
data['CompanyVATAmount'] = this.companyVATAmount;
|
||||||
|
data['TotalVATAmount'] = this.totalVATAmount;
|
||||||
|
data['Price'] = this.price;
|
||||||
|
data['PatientID'] = this.patientID;
|
||||||
|
data['PatientName'] = this.patientName;
|
||||||
|
data['PatientNameN'] = this.patientNameN;
|
||||||
|
data['NationalityID'] = this.nationalityID;
|
||||||
|
data['DoctorName'] = this.doctorName;
|
||||||
|
data['DoctorNameN'] = this.doctorNameN;
|
||||||
|
data['ClinicID'] = this.clinicID;
|
||||||
|
data['ClinicDescription'] = this.clinicDescription;
|
||||||
|
data['ClinicDescriptionN'] = this.clinicDescriptionN;
|
||||||
|
data['AppointmentDate'] = this.appointmentDate;
|
||||||
|
data['AppointmentNo'] = this.appointmentNo;
|
||||||
|
data['InsuranceID'] = this.insuranceID;
|
||||||
|
data['CompanyID'] = this.companyID;
|
||||||
|
data['CompanyName'] = this.companyName;
|
||||||
|
data['CompanyNameN'] = this.companyNameN;
|
||||||
|
data['CompanyAddress'] = this.companyAddress;
|
||||||
|
data['CompanyAddressN'] = this.companyAddressN;
|
||||||
|
data['CompanyGroupAddress'] = this.companyGroupAddress;
|
||||||
|
data['GroupName'] = this.groupName;
|
||||||
|
data['GroupNameN'] = this.groupNameN;
|
||||||
|
data['PatientAddress'] = this.patientAddress;
|
||||||
|
data['VATNo'] = this.vATNo;
|
||||||
|
data['PaymentDate'] = this.paymentDate;
|
||||||
|
data['ProjectName'] = this.projectName;
|
||||||
|
data['TotalDiscount'] = this.totalDiscount;
|
||||||
|
data['TotalPatientShareWithQuantity'] = this.totalPatientShareWithQuantity;
|
||||||
|
data['LegalName'] = this.legalName;
|
||||||
|
data['LegalNameN'] = this.legalNameN;
|
||||||
|
data['AdvanceAdjustment'] = this.advanceAdjustment;
|
||||||
|
data['DoctorImageURL'] = this.doctorImageURL;
|
||||||
|
if (this.listConsultation != null) {
|
||||||
|
data['listConsultation'] =
|
||||||
|
this.listConsultation.map((v) => v.toJson()).toList();
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ListConsultation {
|
||||||
|
dynamic projectID;
|
||||||
|
dynamic doctorID;
|
||||||
|
dynamic grandTotal;
|
||||||
|
int quantity;
|
||||||
|
int total;
|
||||||
|
dynamic discount;
|
||||||
|
int subTotal;
|
||||||
|
dynamic invoiceNo;
|
||||||
|
dynamic createdOn;
|
||||||
|
String procedureID;
|
||||||
|
String procedureName;
|
||||||
|
dynamic procedureNameN;
|
||||||
|
dynamic procedurePrice;
|
||||||
|
int patientShare;
|
||||||
|
dynamic companyShare;
|
||||||
|
int totalPatientShare;
|
||||||
|
dynamic totalCompanyShare;
|
||||||
|
dynamic totalShare;
|
||||||
|
dynamic discountAmount;
|
||||||
|
int vATPercentage;
|
||||||
|
int patientVATAmount;
|
||||||
|
dynamic companyVATAmount;
|
||||||
|
dynamic totalVATAmount;
|
||||||
|
int price;
|
||||||
|
dynamic patientID;
|
||||||
|
dynamic patientName;
|
||||||
|
dynamic patientNameN;
|
||||||
|
dynamic nationalityID;
|
||||||
|
dynamic doctorName;
|
||||||
|
dynamic doctorNameN;
|
||||||
|
dynamic clinicID;
|
||||||
|
dynamic clinicDescription;
|
||||||
|
dynamic clinicDescriptionN;
|
||||||
|
dynamic appointmentDate;
|
||||||
|
dynamic appointmentNo;
|
||||||
|
dynamic insuranceID;
|
||||||
|
dynamic companyID;
|
||||||
|
dynamic companyName;
|
||||||
|
dynamic companyNameN;
|
||||||
|
dynamic companyAddress;
|
||||||
|
dynamic companyAddressN;
|
||||||
|
dynamic companyGroupAddress;
|
||||||
|
dynamic groupName;
|
||||||
|
dynamic groupNameN;
|
||||||
|
dynamic patientAddress;
|
||||||
|
String vATNo;
|
||||||
|
dynamic paymentDate;
|
||||||
|
dynamic projectName;
|
||||||
|
dynamic totalDiscount;
|
||||||
|
dynamic totalPatientShareWithQuantity;
|
||||||
|
dynamic legalName;
|
||||||
|
dynamic legalNameN;
|
||||||
|
int advanceAdjustment;
|
||||||
|
|
||||||
|
ListConsultation(
|
||||||
|
{this.projectID,
|
||||||
|
this.doctorID,
|
||||||
|
this.grandTotal,
|
||||||
|
this.quantity,
|
||||||
|
this.total,
|
||||||
|
this.discount,
|
||||||
|
this.subTotal,
|
||||||
|
this.invoiceNo,
|
||||||
|
this.createdOn,
|
||||||
|
this.procedureID,
|
||||||
|
this.procedureName,
|
||||||
|
this.procedureNameN,
|
||||||
|
this.procedurePrice,
|
||||||
|
this.patientShare,
|
||||||
|
this.companyShare,
|
||||||
|
this.totalPatientShare,
|
||||||
|
this.totalCompanyShare,
|
||||||
|
this.totalShare,
|
||||||
|
this.discountAmount,
|
||||||
|
this.vATPercentage,
|
||||||
|
this.patientVATAmount,
|
||||||
|
this.companyVATAmount,
|
||||||
|
this.totalVATAmount,
|
||||||
|
this.price,
|
||||||
|
this.patientID,
|
||||||
|
this.patientName,
|
||||||
|
this.patientNameN,
|
||||||
|
this.nationalityID,
|
||||||
|
this.doctorName,
|
||||||
|
this.doctorNameN,
|
||||||
|
this.clinicID,
|
||||||
|
this.clinicDescription,
|
||||||
|
this.clinicDescriptionN,
|
||||||
|
this.appointmentDate,
|
||||||
|
this.appointmentNo,
|
||||||
|
this.insuranceID,
|
||||||
|
this.companyID,
|
||||||
|
this.companyName,
|
||||||
|
this.companyNameN,
|
||||||
|
this.companyAddress,
|
||||||
|
this.companyAddressN,
|
||||||
|
this.companyGroupAddress,
|
||||||
|
this.groupName,
|
||||||
|
this.groupNameN,
|
||||||
|
this.patientAddress,
|
||||||
|
this.vATNo,
|
||||||
|
this.paymentDate,
|
||||||
|
this.projectName,
|
||||||
|
this.totalDiscount,
|
||||||
|
this.totalPatientShareWithQuantity,
|
||||||
|
this.legalName,
|
||||||
|
this.legalNameN,
|
||||||
|
this.advanceAdjustment});
|
||||||
|
|
||||||
|
ListConsultation.fromJson(Map<String, dynamic> json) {
|
||||||
|
projectID = json['ProjectID'];
|
||||||
|
doctorID = json['DoctorID'];
|
||||||
|
grandTotal = json['GrandTotal'];
|
||||||
|
quantity = json['Quantity'];
|
||||||
|
total = json['Total'];
|
||||||
|
discount = json['Discount'];
|
||||||
|
subTotal = json['SubTotal'];
|
||||||
|
invoiceNo = json['InvoiceNo'];
|
||||||
|
createdOn = json['CreatedOn'];
|
||||||
|
procedureID = json['ProcedureID'];
|
||||||
|
procedureName = json['ProcedureName'];
|
||||||
|
procedureNameN = json['ProcedureNameN'];
|
||||||
|
procedurePrice = json['ProcedurePrice'];
|
||||||
|
patientShare = json['PatientShare'];
|
||||||
|
companyShare = json['CompanyShare'];
|
||||||
|
totalPatientShare = json['TotalPatientShare'];
|
||||||
|
totalCompanyShare = json['TotalCompanyShare'];
|
||||||
|
totalShare = json['TotalShare'];
|
||||||
|
discountAmount = json['DiscountAmount'];
|
||||||
|
vATPercentage = json['VATPercentage'];
|
||||||
|
patientVATAmount = json['PatientVATAmount'];
|
||||||
|
companyVATAmount = json['CompanyVATAmount'];
|
||||||
|
totalVATAmount = json['TotalVATAmount'];
|
||||||
|
price = json['Price'];
|
||||||
|
patientID = json['PatientID'];
|
||||||
|
patientName = json['PatientName'];
|
||||||
|
patientNameN = json['PatientNameN'];
|
||||||
|
nationalityID = json['NationalityID'];
|
||||||
|
doctorName = json['DoctorName'];
|
||||||
|
doctorNameN = json['DoctorNameN'];
|
||||||
|
clinicID = json['ClinicID'];
|
||||||
|
clinicDescription = json['ClinicDescription'];
|
||||||
|
clinicDescriptionN = json['ClinicDescriptionN'];
|
||||||
|
appointmentDate = json['AppointmentDate'];
|
||||||
|
appointmentNo = json['AppointmentNo'];
|
||||||
|
insuranceID = json['InsuranceID'];
|
||||||
|
companyID = json['CompanyID'];
|
||||||
|
companyName = json['CompanyName'];
|
||||||
|
companyNameN = json['CompanyNameN'];
|
||||||
|
companyAddress = json['CompanyAddress'];
|
||||||
|
companyAddressN = json['CompanyAddressN'];
|
||||||
|
companyGroupAddress = json['CompanyGroupAddress'];
|
||||||
|
groupName = json['GroupName'];
|
||||||
|
groupNameN = json['GroupNameN'];
|
||||||
|
patientAddress = json['PatientAddress'];
|
||||||
|
vATNo = json['VATNo'];
|
||||||
|
paymentDate = json['PaymentDate'];
|
||||||
|
projectName = json['ProjectName'];
|
||||||
|
totalDiscount = json['TotalDiscount'];
|
||||||
|
totalPatientShareWithQuantity = json['TotalPatientShareWithQuantity'];
|
||||||
|
legalName = json['LegalName'];
|
||||||
|
legalNameN = json['LegalNameN'];
|
||||||
|
advanceAdjustment = json['AdvanceAdjustment'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
data['ProjectID'] = this.projectID;
|
||||||
|
data['DoctorID'] = this.doctorID;
|
||||||
|
data['GrandTotal'] = this.grandTotal;
|
||||||
|
data['Quantity'] = this.quantity;
|
||||||
|
data['Total'] = this.total;
|
||||||
|
data['Discount'] = this.discount;
|
||||||
|
data['SubTotal'] = this.subTotal;
|
||||||
|
data['InvoiceNo'] = this.invoiceNo;
|
||||||
|
data['CreatedOn'] = this.createdOn;
|
||||||
|
data['ProcedureID'] = this.procedureID;
|
||||||
|
data['ProcedureName'] = this.procedureName;
|
||||||
|
data['ProcedureNameN'] = this.procedureNameN;
|
||||||
|
data['ProcedurePrice'] = this.procedurePrice;
|
||||||
|
data['PatientShare'] = this.patientShare;
|
||||||
|
data['CompanyShare'] = this.companyShare;
|
||||||
|
data['TotalPatientShare'] = this.totalPatientShare;
|
||||||
|
data['TotalCompanyShare'] = this.totalCompanyShare;
|
||||||
|
data['TotalShare'] = this.totalShare;
|
||||||
|
data['DiscountAmount'] = this.discountAmount;
|
||||||
|
data['VATPercentage'] = this.vATPercentage;
|
||||||
|
data['PatientVATAmount'] = this.patientVATAmount;
|
||||||
|
data['CompanyVATAmount'] = this.companyVATAmount;
|
||||||
|
data['TotalVATAmount'] = this.totalVATAmount;
|
||||||
|
data['Price'] = this.price;
|
||||||
|
data['PatientID'] = this.patientID;
|
||||||
|
data['PatientName'] = this.patientName;
|
||||||
|
data['PatientNameN'] = this.patientNameN;
|
||||||
|
data['NationalityID'] = this.nationalityID;
|
||||||
|
data['DoctorName'] = this.doctorName;
|
||||||
|
data['DoctorNameN'] = this.doctorNameN;
|
||||||
|
data['ClinicID'] = this.clinicID;
|
||||||
|
data['ClinicDescription'] = this.clinicDescription;
|
||||||
|
data['ClinicDescriptionN'] = this.clinicDescriptionN;
|
||||||
|
data['AppointmentDate'] = this.appointmentDate;
|
||||||
|
data['AppointmentNo'] = this.appointmentNo;
|
||||||
|
data['InsuranceID'] = this.insuranceID;
|
||||||
|
data['CompanyID'] = this.companyID;
|
||||||
|
data['CompanyName'] = this.companyName;
|
||||||
|
data['CompanyNameN'] = this.companyNameN;
|
||||||
|
data['CompanyAddress'] = this.companyAddress;
|
||||||
|
data['CompanyAddressN'] = this.companyAddressN;
|
||||||
|
data['CompanyGroupAddress'] = this.companyGroupAddress;
|
||||||
|
data['GroupName'] = this.groupName;
|
||||||
|
data['GroupNameN'] = this.groupNameN;
|
||||||
|
data['PatientAddress'] = this.patientAddress;
|
||||||
|
data['VATNo'] = this.vATNo;
|
||||||
|
data['PaymentDate'] = this.paymentDate;
|
||||||
|
data['ProjectName'] = this.projectName;
|
||||||
|
data['TotalDiscount'] = this.totalDiscount;
|
||||||
|
data['TotalPatientShareWithQuantity'] = this.totalPatientShareWithQuantity;
|
||||||
|
data['LegalName'] = this.legalName;
|
||||||
|
data['LegalNameN'] = this.legalNameN;
|
||||||
|
data['AdvanceAdjustment'] = this.advanceAdjustment;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,100 @@
|
|||||||
|
class GetDentalAppointmentsResponse {
|
||||||
|
List<ListDentalAppointments> listDentalAppointments;
|
||||||
|
|
||||||
|
GetDentalAppointmentsResponse({this.listDentalAppointments});
|
||||||
|
|
||||||
|
GetDentalAppointmentsResponse.fromJson(Map<String, dynamic> json) {
|
||||||
|
if (json['List_DentalAppointments'] != null) {
|
||||||
|
listDentalAppointments = new List<ListDentalAppointments>();
|
||||||
|
json['List_DentalAppointments'].forEach((v) {
|
||||||
|
listDentalAppointments.add(new ListDentalAppointments.fromJson(v));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
if (this.listDentalAppointments != null) {
|
||||||
|
data['List_DentalAppointments'] =
|
||||||
|
this.listDentalAppointments.map((v) => v.toJson()).toList();
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ListDentalAppointments {
|
||||||
|
String setupId;
|
||||||
|
int projectID;
|
||||||
|
int patientID;
|
||||||
|
int appointmentNo;
|
||||||
|
String appointmentDate;
|
||||||
|
dynamic appointmentDateN;
|
||||||
|
int clinicID;
|
||||||
|
int doctorID;
|
||||||
|
int invoiceNo;
|
||||||
|
int status;
|
||||||
|
String arrivedOn;
|
||||||
|
String doctorName;
|
||||||
|
dynamic doctorNameN;
|
||||||
|
String clinicName;
|
||||||
|
String doctorImageURL;
|
||||||
|
String projectName;
|
||||||
|
|
||||||
|
ListDentalAppointments(
|
||||||
|
{this.setupId,
|
||||||
|
this.projectID,
|
||||||
|
this.patientID,
|
||||||
|
this.appointmentNo,
|
||||||
|
this.appointmentDate,
|
||||||
|
this.appointmentDateN,
|
||||||
|
this.clinicID,
|
||||||
|
this.doctorID,
|
||||||
|
this.invoiceNo,
|
||||||
|
this.status,
|
||||||
|
this.arrivedOn,
|
||||||
|
this.doctorName,
|
||||||
|
this.doctorNameN,
|
||||||
|
this.clinicName,
|
||||||
|
this.doctorImageURL,
|
||||||
|
this.projectName});
|
||||||
|
|
||||||
|
ListDentalAppointments.fromJson(Map<String, dynamic> json) {
|
||||||
|
setupId = json['SetupId'];
|
||||||
|
projectID = json['ProjectID'];
|
||||||
|
patientID = json['PatientID'];
|
||||||
|
appointmentNo = json['AppointmentNo'];
|
||||||
|
appointmentDate = json['AppointmentDate'];
|
||||||
|
appointmentDateN = json['AppointmentDateN'];
|
||||||
|
clinicID = json['ClinicID'];
|
||||||
|
doctorID = json['DoctorID'];
|
||||||
|
invoiceNo = json['InvoiceNo'];
|
||||||
|
status = json['Status'];
|
||||||
|
arrivedOn = json['ArrivedOn'];
|
||||||
|
doctorName = json['DoctorName'];
|
||||||
|
doctorNameN = json['DoctorNameN'];
|
||||||
|
clinicName = json['ClinicName'];
|
||||||
|
doctorImageURL = json['DoctorImageURL'];
|
||||||
|
projectName = json['ProjectName'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
data['SetupId'] = this.setupId;
|
||||||
|
data['ProjectID'] = this.projectID;
|
||||||
|
data['PatientID'] = this.patientID;
|
||||||
|
data['AppointmentNo'] = this.appointmentNo;
|
||||||
|
data['AppointmentDate'] = this.appointmentDate;
|
||||||
|
data['AppointmentDateN'] = this.appointmentDateN;
|
||||||
|
data['ClinicID'] = this.clinicID;
|
||||||
|
data['DoctorID'] = this.doctorID;
|
||||||
|
data['InvoiceNo'] = this.invoiceNo;
|
||||||
|
data['Status'] = this.status;
|
||||||
|
data['ArrivedOn'] = this.arrivedOn;
|
||||||
|
data['DoctorName'] = this.doctorName;
|
||||||
|
data['DoctorNameN'] = this.doctorNameN;
|
||||||
|
data['ClinicName'] = this.clinicName;
|
||||||
|
data['DoctorImageURL'] = this.doctorImageURL;
|
||||||
|
data['ProjectName'] = this.projectName;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,53 @@
|
|||||||
|
class ServicePrice {
|
||||||
|
String currency;
|
||||||
|
double maxPrice;
|
||||||
|
double maxTotalPrice;
|
||||||
|
double maxVAT;
|
||||||
|
double minPrice;
|
||||||
|
double minTotalPrice;
|
||||||
|
double minVAT;
|
||||||
|
int price;
|
||||||
|
int totalPrice;
|
||||||
|
int vat;
|
||||||
|
|
||||||
|
ServicePrice({
|
||||||
|
this.currency,
|
||||||
|
this.maxPrice,
|
||||||
|
this.maxTotalPrice,
|
||||||
|
this.maxVAT,
|
||||||
|
this.minPrice,
|
||||||
|
this.minTotalPrice,
|
||||||
|
this.minVAT,
|
||||||
|
this.price,
|
||||||
|
this.totalPrice,
|
||||||
|
this.vat});
|
||||||
|
|
||||||
|
ServicePrice.fromJson(dynamic json) {
|
||||||
|
currency = json["Currency"];
|
||||||
|
maxPrice = json["MaxPrice"];
|
||||||
|
maxTotalPrice = json["MaxTotalPrice"];
|
||||||
|
maxVAT = json["MaxVAT"];
|
||||||
|
minPrice = json["MinPrice"];
|
||||||
|
minTotalPrice = json["MinTotalPrice"];
|
||||||
|
minVAT = json["MinVAT"];
|
||||||
|
price = json["Price"];
|
||||||
|
totalPrice = json["TotalPrice"];
|
||||||
|
vat = json["VAT"];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
var map = <String, dynamic>{};
|
||||||
|
map["Currency"] = currency;
|
||||||
|
map["MaxPrice"] = maxPrice;
|
||||||
|
map["MaxTotalPrice"] = maxTotalPrice;
|
||||||
|
map["MaxVAT"] = maxVAT;
|
||||||
|
map["MinPrice"] = minPrice;
|
||||||
|
map["MinTotalPrice"] = minTotalPrice;
|
||||||
|
map["MinVAT"] = minVAT;
|
||||||
|
map["Price"] = price;
|
||||||
|
map["TotalPrice"] = totalPrice;
|
||||||
|
map["VAT"] = vat;
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,52 @@
|
|||||||
|
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class LiveCareBookAppointment extends StatefulWidget {
|
||||||
|
@override
|
||||||
|
_LiveCareBookAppointmentState createState() =>
|
||||||
|
_LiveCareBookAppointmentState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _LiveCareBookAppointmentState extends State<LiveCareBookAppointment> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return AppScaffold(
|
||||||
|
appBarTitle: TranslationBase.of(context).bookAppo,
|
||||||
|
isShowAppBar: true,
|
||||||
|
isShowDecPage: false,
|
||||||
|
body: SingleChildScrollView(
|
||||||
|
child: Container(
|
||||||
|
margin: EdgeInsets.all(10.0),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.all(5.0),
|
||||||
|
child: Text(TranslationBase.of(context).clinicAcceptLivecare,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.black,
|
||||||
|
fontSize: 16.0,
|
||||||
|
letterSpacing: 0.5)),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.all(15.0),
|
||||||
|
padding: EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 10.0),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.green,
|
||||||
|
borderRadius: BorderRadius.all(Radius.circular(8.0))),
|
||||||
|
child: Text(TranslationBase.of(context).livecareModalTop,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.white,
|
||||||
|
fontSize: 16.0,
|
||||||
|
fontWeight: FontWeight.w600,
|
||||||
|
letterSpacing: 0.5)),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,121 @@
|
|||||||
|
import 'package:diplomaticquarterapp/models/Appointments/DoctorProfile.dart';
|
||||||
|
import 'package:diplomaticquarterapp/models/Appointments/doctor_pre_post_image.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class DoctorPostPreImagesPage extends StatefulWidget{
|
||||||
|
final DoctorPrePostImages doctorPrePostImages;
|
||||||
|
|
||||||
|
const DoctorPostPreImagesPage({this.doctorPrePostImages});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<StatefulWidget> createState() => DoctorPostPreImagesPageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class DoctorPostPreImagesPageState extends State<DoctorPostPreImagesPage>{
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
var images = widget.doctorPrePostImages;
|
||||||
|
return AppScaffold(
|
||||||
|
appBarTitle: TranslationBase.of(context).beforeAfterImages,
|
||||||
|
isShowAppBar: true,
|
||||||
|
isShowDecPage: false,
|
||||||
|
body: Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 10),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Text("Before Image", style: TextStyle(color: Colors.black, fontSize: 17, fontWeight: FontWeight.bold, letterSpacing: 1),),
|
||||||
|
Image.memory(images.getPreBytes(), errorBuilder: (ctx,err, trace){
|
||||||
|
return Container(
|
||||||
|
color: Colors.grey.withOpacity(0.25),
|
||||||
|
);
|
||||||
|
},)
|
||||||
|
],
|
||||||
|
)
|
||||||
|
),
|
||||||
|
Divider(color: Colors.grey.withOpacity(0.5)),
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Text("After Image", style: TextStyle(color: Colors.black, fontSize: 17, fontWeight: FontWeight.bold, letterSpacing: 1),),
|
||||||
|
Image.memory(images.getPostBytes(),errorBuilder: (ctx,err, trace){
|
||||||
|
return Container(
|
||||||
|
color: Colors.grey.withOpacity(0.25),
|
||||||
|
);
|
||||||
|
},)
|
||||||
|
],
|
||||||
|
)
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class DoctorPostPreImagesContent extends StatefulWidget{
|
||||||
|
final DoctorPrePostImages doctorPrePostImages;
|
||||||
|
|
||||||
|
const DoctorPostPreImagesContent({this.doctorPrePostImages});
|
||||||
|
|
||||||
|
@override
|
||||||
|
DoctorPostPreImagesContentState createState() => DoctorPostPreImagesContentState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class DoctorPostPreImagesContentState extends State<DoctorPostPreImagesContent>{
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
var images = widget.doctorPrePostImages;
|
||||||
|
return Material(
|
||||||
|
color: Colors.transparent,
|
||||||
|
child: Center(
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Text("Before", style: TextStyle(color: Colors.white, fontSize: 17, fontWeight: FontWeight.bold, letterSpacing: 1),),
|
||||||
|
SizedBox(height: 10,),
|
||||||
|
Image.memory(images.getPreBytes(), errorBuilder: (ctx,err, trace){
|
||||||
|
return Container(
|
||||||
|
color: Colors.grey.withOpacity(0.25),
|
||||||
|
);
|
||||||
|
},)
|
||||||
|
],
|
||||||
|
)
|
||||||
|
),
|
||||||
|
Divider(color: Colors.grey.withOpacity(0.5)),
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Text("After", style: TextStyle(color: Colors.white, fontSize: 17, fontWeight: FontWeight.bold, letterSpacing: 1),),
|
||||||
|
SizedBox(height: 10,),
|
||||||
|
Image.memory(images.getPostBytes(),errorBuilder: (ctx,err, trace){
|
||||||
|
return Container(
|
||||||
|
color: Colors.grey.withOpacity(0.25),
|
||||||
|
);
|
||||||
|
},)
|
||||||
|
],
|
||||||
|
)
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,49 @@
|
|||||||
|
import 'package:diplomaticquarterapp/pages/conference/clipped_video.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class RRTAgreementPage extends StatelessWidget{
|
||||||
|
TranslationBase localize;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
localize = TranslationBase.of(context);
|
||||||
|
|
||||||
|
return AppScaffold(
|
||||||
|
appBarTitle: localize.userAgreement,
|
||||||
|
isShowAppBar: true,
|
||||||
|
showHomeAppBarIcon: false,
|
||||||
|
body: SingleChildScrollView(
|
||||||
|
padding: EdgeInsets.all(20),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Text(localize.rrtUserAgreementTitle, style: TextStyle(color: Colors.black, fontWeight: FontWeight.w500, fontSize: 22), maxLines: 100, textAlign: TextAlign.center),
|
||||||
|
SizedBox(height: 20),
|
||||||
|
text(localize.rrtUserAgreementP1),
|
||||||
|
text(localize.rrtUserAgreementP2),
|
||||||
|
text(localize.rrtUserAgreementP3)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget text(String string)=> Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(vertical: 15),
|
||||||
|
child: Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
clipBehavior: Clip.hardEdge,
|
||||||
|
width: 10, height: 10,
|
||||||
|
decoration: BoxDecoration(borderRadius: BorderRadius.circular(20), color: Colors.black)
|
||||||
|
),
|
||||||
|
SizedBox(width: 20),
|
||||||
|
Expanded(child: Text(string, style: TextStyle(color: Colors.black87, fontSize: 18), maxLines: 100, textAlign: TextAlign.justify)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
@ -1,94 +1,54 @@
|
|||||||
|
import 'package:diplomaticquarterapp/core/model/prescriptions/prescriptions_order.dart';
|
||||||
import 'package:diplomaticquarterapp/core/viewModels/er/rrt-view-model.dart';
|
import 'package:diplomaticquarterapp/core/viewModels/er/rrt-view-model.dart';
|
||||||
|
import 'package:diplomaticquarterapp/locator.dart';
|
||||||
|
import 'package:diplomaticquarterapp/pages/ErService/rapid-response-team/rrt-order-list-item.dart';
|
||||||
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
|
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
|
||||||
class RRTLogPage extends StatefulWidget{
|
class RRTLogPage extends StatefulWidget{
|
||||||
|
final List<PrescriptionsOrder> orders;
|
||||||
|
|
||||||
|
const RRTLogPage({this.orders});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<StatefulWidget> createState() => RRTLogPageState();
|
State<StatefulWidget> createState() => RRTLogPageState();
|
||||||
|
|
||||||
}
|
}
|
||||||
class RRTLogPageState extends State<RRTLogPage>{
|
class RRTLogPageState extends State<RRTLogPage>{
|
||||||
|
|
||||||
|
RRTViewModel viewModel;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return BaseView<RRTViewModel>(
|
|
||||||
onModelReady: (viewModel){
|
|
||||||
|
|
||||||
},
|
return BaseView<RRTViewModel>(
|
||||||
builder: (ctx, vm, widget){
|
onModelReady: (vm) => viewModel = vm,
|
||||||
|
builder: (ctx, vm, widgetState){
|
||||||
return ListView.builder(
|
return ListView.builder(
|
||||||
itemCount: 10,
|
itemCount: widget.orders.length,
|
||||||
itemBuilder: (ctx, idx) => RRTLogListItem()
|
itemBuilder: (ctx, idx) {
|
||||||
);
|
var order = widget.orders[idx];
|
||||||
|
return RRTLogListItem(order, onCancel: deleteOrder);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// ------------------------
|
|
||||||
// List Item Widget
|
|
||||||
// ------------------------
|
|
||||||
|
|
||||||
|
|
||||||
final _item_content_seperator = Container(height: 0.25, padding: EdgeInsets.all(10), color: Colors.grey.withOpacity(0.5));
|
|
||||||
|
|
||||||
class RRTLogListItem extends StatelessWidget{
|
|
||||||
BuildContext _context;
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
_context = context;
|
|
||||||
|
|
||||||
return Container(
|
|
||||||
padding: EdgeInsets.all(15), margin: EdgeInsets.symmetric(horizontal: 15, vertical: 10),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: Colors.white,
|
|
||||||
borderRadius: BorderRadius.circular(15),
|
|
||||||
boxShadow: [BoxShadow(color: Colors.grey.withOpacity(0.25), spreadRadius: 1, blurRadius: 3)]
|
|
||||||
),
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
|
||||||
children: [
|
|
||||||
_contentItem(label: "Request ID", value: "2318"),
|
|
||||||
_item_content_seperator,
|
|
||||||
_contentItem(label: "Status", value: "2318"),
|
|
||||||
_item_content_seperator,
|
|
||||||
_contentItem(label: "Pickup Date", value: "2318"),
|
|
||||||
_item_content_seperator,
|
|
||||||
_contentItem(label: "Location", value: "2318"),
|
|
||||||
_item_content_seperator,
|
|
||||||
SizedBox(height: 10),
|
|
||||||
FractionallySizedBox(child: cancelButton())
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _contentItem({@required String label, String value}){
|
deleteOrder(PrescriptionsOrder order) async {
|
||||||
return Container(
|
GifLoaderDialogUtils.showMyDialog(context);
|
||||||
padding: EdgeInsets.symmetric(vertical: 10),
|
var success = await viewModel.cancelOrder(order);
|
||||||
child: Column(
|
GifLoaderDialogUtils.hideDialog(context);
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
if(success)
|
||||||
children: [
|
setState(() {
|
||||||
Text(label, style: TextStyle(color: Theme.of(_context).appBarTheme.color, fontSize: 9, letterSpacing: 1),),
|
widget.orders.remove(order);
|
||||||
SizedBox(height: 5,),
|
});
|
||||||
Text(value, style: TextStyle(color: Theme.of(_context).appBarTheme.color,fontWeight: FontWeight.bold, fontSize: 14),),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget cancelButton() => MaterialButton(
|
|
||||||
height: 45,
|
|
||||||
color: Color(0xFFc5272d),
|
|
||||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10) ),
|
|
||||||
onPressed: () { },
|
|
||||||
child: Text("CANCEL", style: TextStyle(color: Colors.white, fontSize: 13),),
|
|
||||||
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,71 @@
|
|||||||
|
|
||||||
|
import 'package:diplomaticquarterapp/core/model/prescriptions/prescriptions_order.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
final _item_content_seperator = Container(height: 0.25, padding: EdgeInsets.all(10), color: Colors.grey.withOpacity(0.5));
|
||||||
|
|
||||||
|
class RRTLogListItem extends StatelessWidget{
|
||||||
|
final PrescriptionsOrder order;
|
||||||
|
final Function(PrescriptionsOrder) onCancel;
|
||||||
|
RRTLogListItem(this.order, {this.onCancel});
|
||||||
|
|
||||||
|
BuildContext _context;
|
||||||
|
|
||||||
|
TranslationBase localize;
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
_context = context;
|
||||||
|
localize = TranslationBase.of(context);
|
||||||
|
|
||||||
|
return Container(
|
||||||
|
padding: EdgeInsets.all(15), margin: EdgeInsets.symmetric(horizontal: 15, vertical: 10),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.circular(15),
|
||||||
|
boxShadow: [BoxShadow(color: Colors.grey.withOpacity(0.25), spreadRadius: 1, blurRadius: 3)]
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||||
|
children: [
|
||||||
|
_contentItem(label: localize.reqId, value: order.iD.toString()),
|
||||||
|
_item_content_seperator,
|
||||||
|
_contentItem(label: localize.status, value: order.getStatusName(localize)),
|
||||||
|
_item_content_seperator,
|
||||||
|
_contentItem(label: localize.pickupDate, value: order.getFormattedDateTime()),
|
||||||
|
_item_content_seperator,
|
||||||
|
_contentItem(label: localize.location, value: order.getNearestProjectDescription()),
|
||||||
|
_item_content_seperator,
|
||||||
|
SizedBox(height: 10),
|
||||||
|
|
||||||
|
if(onCancel != null)
|
||||||
|
FractionallySizedBox(child: cancelButton())
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _contentItem({@required String label, String value}){
|
||||||
|
return Container(
|
||||||
|
padding: EdgeInsets.symmetric(vertical: 10),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Text(label, style: TextStyle(color: Theme.of(_context).appBarTheme.color, fontSize: 9, letterSpacing: 1),),
|
||||||
|
SizedBox(height: 5,),
|
||||||
|
Text(value, style: TextStyle(color: Theme.of(_context).appBarTheme.color,fontWeight: FontWeight.bold, fontSize: 14),),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget cancelButton() => MaterialButton(
|
||||||
|
height: 45,
|
||||||
|
color: Color(0xFFc5272d),
|
||||||
|
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10) ),
|
||||||
|
onPressed: () => onCancel(order),
|
||||||
|
child: Text(localize.cancel, style: TextStyle(color: Colors.white, fontSize: 13),),
|
||||||
|
|
||||||
|
);
|
||||||
|
}
|
@ -0,0 +1,195 @@
|
|||||||
|
import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart';
|
||||||
|
import 'package:diplomaticquarterapp/core/viewModels/er/rrt-view-model.dart';
|
||||||
|
import 'package:diplomaticquarterapp/models/rrt/service_price.dart';
|
||||||
|
import 'package:diplomaticquarterapp/pages/ErService/ErOptions.dart';
|
||||||
|
import 'package:diplomaticquarterapp/pages/ErService/rapid-response-team/rrt-main-screen.dart';
|
||||||
|
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/utils.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/dialogs/alert_dialog.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:google_maps_flutter/google_maps_flutter.dart';
|
||||||
|
|
||||||
|
class RRTPlaceOrderPage extends StatelessWidget{
|
||||||
|
TranslationBase localize;
|
||||||
|
RRTViewModel viewModel;
|
||||||
|
Addresses selectedAddress;
|
||||||
|
final ServicePrice servicePrice;
|
||||||
|
|
||||||
|
RRTPlaceOrderPage({@required this.selectedAddress, @required this.servicePrice});
|
||||||
|
|
||||||
|
TextEditingController noteController = TextEditingController(text: '');
|
||||||
|
BuildContext _context;
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
_context = context;
|
||||||
|
localize = TranslationBase.of(context);
|
||||||
|
var lat = selectedAddress.latLong.split(',').first;
|
||||||
|
var lng = selectedAddress.latLong.split(',').last;
|
||||||
|
|
||||||
|
return BaseView<RRTViewModel>(
|
||||||
|
onModelReady: (vm) => viewModel = vm,
|
||||||
|
builder: (ctx,vm,wState){
|
||||||
|
return AppScaffold(
|
||||||
|
appBarTitle: localize.rapidResponseTeam,
|
||||||
|
isShowAppBar: true,
|
||||||
|
body: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: SingleChildScrollView(
|
||||||
|
padding: EdgeInsets.all(20),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||||
|
children: [
|
||||||
|
Text(localize.selectedLocation, style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18),),
|
||||||
|
|
||||||
|
selectedAddressField(),
|
||||||
|
|
||||||
|
AspectRatio(
|
||||||
|
aspectRatio: 3/1,
|
||||||
|
child: ClipRRect(
|
||||||
|
clipBehavior: Clip.hardEdge,
|
||||||
|
borderRadius: BorderRadius.circular(10),
|
||||||
|
child: Image.network(
|
||||||
|
"https://maps.googleapis.com/maps/api/staticmap?center=$lat,$lng &zoom=16&size=800x400&maptype=roadmap&markers=color:red%7C$lat,$lng&key=AIzaSyCyDbWUM9d_sBUGIE8PcuShzPaqO08NSC8",
|
||||||
|
fit: BoxFit.cover,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(height: 10,),
|
||||||
|
|
||||||
|
Container(
|
||||||
|
height: 70,
|
||||||
|
margin: EdgeInsets.symmetric(vertical: 5),
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 15, vertical: 10),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white, borderRadius: BorderRadius.circular(10),
|
||||||
|
boxShadow: [BoxShadow(blurRadius: 5, spreadRadius: 2, offset: Offset(2,2), color: Colors.grey.withOpacity(0.25))]
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Text(localize.totalAmountPayable, style: TextStyle(fontSize: 13),),
|
||||||
|
SizedBox(height: 5,),
|
||||||
|
Text("${servicePrice.totalPrice ?? '- - -'} ${localize.sar}" , style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18),),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
Container(
|
||||||
|
height: 70,
|
||||||
|
margin: EdgeInsets.symmetric(vertical: 5),
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 0, vertical: 10),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white, borderRadius: BorderRadius.circular(10),
|
||||||
|
boxShadow: [BoxShadow(blurRadius: 5, spreadRadius: 2, offset: Offset(2,2), color: Colors.grey.withOpacity(0.25))]
|
||||||
|
),
|
||||||
|
child: TextField(
|
||||||
|
controller: noteController,
|
||||||
|
style: TextStyle(fontSize: 18.0),
|
||||||
|
decoration: InputDecoration(
|
||||||
|
filled: true,
|
||||||
|
fillColor: Colors.white,
|
||||||
|
labelText: localize.notes,
|
||||||
|
contentPadding: const EdgeInsets.only(left: 14.0, bottom: 8.0, top: 8.0),
|
||||||
|
focusedBorder: OutlineInputBorder(
|
||||||
|
borderSide: BorderSide(color: Colors.white),
|
||||||
|
borderRadius: BorderRadius.circular(10),
|
||||||
|
),
|
||||||
|
enabledBorder: UnderlineInputBorder(
|
||||||
|
borderSide: BorderSide(color: Colors.white),
|
||||||
|
borderRadius: BorderRadius.circular(10),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
submitButton(context)
|
||||||
|
],
|
||||||
|
)
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Widget selectedAddressField(){
|
||||||
|
var address = "${selectedAddress.address1 ?? ''} ${selectedAddress.address2 ?? ''}";
|
||||||
|
return Container(
|
||||||
|
margin: EdgeInsets.symmetric(vertical: 10),
|
||||||
|
child: Expanded(
|
||||||
|
child: MaterialButton(
|
||||||
|
height: 50, color: Colors.white,
|
||||||
|
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10) ),
|
||||||
|
onPressed: (){},
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(child: Text(address, style: TextStyle(color: Colors.black87, fontSize: 15, letterSpacing: 1))),
|
||||||
|
Icon(Icons.location_on_rounded, size: 30, color: Colors.black,)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Widget submitButton(BuildContext context){
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.all(15),
|
||||||
|
child: MaterialButton(
|
||||||
|
height: 50,
|
||||||
|
color: Theme.of(context).appBarTheme.color,
|
||||||
|
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
|
||||||
|
onPressed: () => placeOrder(),
|
||||||
|
child: Text(localize.submit, style: TextStyle(color: Colors.white, fontSize: 15, letterSpacing: 1),),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
placeOrder() async{
|
||||||
|
if(selectedAddress != null && selectedAddress.latLong != null && selectedAddress.latLong.isNotEmpty && selectedAddress.latLong.split(',').length > 1){
|
||||||
|
GifLoaderDialogUtils.showMyDialog(_context);
|
||||||
|
|
||||||
|
Map<String, dynamic> params = {};
|
||||||
|
var cordinates = selectedAddress.latLong.split(',');
|
||||||
|
var latlng = LatLng(double.parse(cordinates.first), double.parse(cordinates.last));
|
||||||
|
params['Latitude'] = latlng.latitude;
|
||||||
|
params['Longitude'] = latlng.longitude;
|
||||||
|
params['Notes'] = noteController.text;
|
||||||
|
var requestId = await viewModel.createOrder(params);
|
||||||
|
|
||||||
|
GifLoaderDialogUtils.hideDialog(_context);
|
||||||
|
|
||||||
|
if(requestId != null){
|
||||||
|
AlertDialogBox(
|
||||||
|
context: _context,
|
||||||
|
title: '',
|
||||||
|
confirmMessage: localize.rrtOrderSuccessMessage,
|
||||||
|
okText: localize.ok,
|
||||||
|
okFunction: (){
|
||||||
|
AlertDialogBox.closeAlertDialog(_context);
|
||||||
|
gotoRRTRoot();
|
||||||
|
}
|
||||||
|
).showAlertDialog(_context);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
AppToast.showErrorToast(message: 'Invalid location selected');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
gotoRRTRoot(){
|
||||||
|
Navigator.popUntil(_context, (route) => Utils.route(route, equalsTo: ErOptions));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,339 @@
|
|||||||
|
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
|
||||||
|
import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart';
|
||||||
|
import 'package:diplomaticquarterapp/models/MyInvoices/DentalInvoiceDetailResponse.dart';
|
||||||
|
import 'package:diplomaticquarterapp/models/MyInvoices/GetDentalAppointmentsResponse.dart';
|
||||||
|
import 'package:diplomaticquarterapp/pages/BookAppointment/widgets/DoctorView.dart';
|
||||||
|
import 'package:diplomaticquarterapp/services/my_invoice_service/my_invoice_services.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/buttons/button.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/others/app_expandable_notifier.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
class InvoiceDetail extends StatelessWidget {
|
||||||
|
final DoctorList doctor;
|
||||||
|
final ListDentalAppointments listDentalAppointments;
|
||||||
|
final DentalInvoiceDetailResponse dentalInvoiceDetailResponse;
|
||||||
|
final BuildContext context;
|
||||||
|
|
||||||
|
int totalServiceRate = 0;
|
||||||
|
int totalDiscount = 0;
|
||||||
|
int totalVAT = 0;
|
||||||
|
int subTotal = 0;
|
||||||
|
int grandTotal = 0;
|
||||||
|
|
||||||
|
InvoiceDetail(this.doctor, this.listDentalAppointments,
|
||||||
|
this.dentalInvoiceDetailResponse, this.context);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
ProjectViewModel projectViewModel = Provider.of(context);
|
||||||
|
return AppScaffold(
|
||||||
|
appBarTitle: TranslationBase.of(context).myInvoice,
|
||||||
|
isShowAppBar: true,
|
||||||
|
isShowDecPage: false,
|
||||||
|
body: SingleChildScrollView(
|
||||||
|
child: Container(
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
DoctorView(
|
||||||
|
doctor: doctor,
|
||||||
|
isLiveCareAppointment: false,
|
||||||
|
isShowFlag: false),
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.only(left: 10.0, right: 10.0),
|
||||||
|
padding: EdgeInsets.only(
|
||||||
|
top: 10.0, left: 10.0, right: 10.0, bottom: 10.0),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.grey[800],
|
||||||
|
borderRadius: BorderRadius.only(
|
||||||
|
topLeft: Radius.circular(8),
|
||||||
|
topRight: Radius.circular(8),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: Table(
|
||||||
|
children: [
|
||||||
|
TableRow(children: [
|
||||||
|
Text("Description",
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.white,
|
||||||
|
fontWeight: FontWeight.bold)),
|
||||||
|
Text("Quantity",
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.white,
|
||||||
|
fontWeight: FontWeight.bold)),
|
||||||
|
Text("Price",
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.white,
|
||||||
|
fontWeight: FontWeight.bold)),
|
||||||
|
Text("Total",
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.white,
|
||||||
|
fontWeight: FontWeight.bold)),
|
||||||
|
]),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.only(top: 0.0, left: 10.0, right: 10.0),
|
||||||
|
padding: EdgeInsets.only(
|
||||||
|
top: 10.0, left: 10.0, right: 10.0, bottom: 15.0),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.only(
|
||||||
|
bottomLeft: Radius.circular(8),
|
||||||
|
bottomRight: Radius.circular(8),
|
||||||
|
)),
|
||||||
|
child: Table(children: fullData(context)),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.only(top: 3.0, left: 12.0, right: 12.0),
|
||||||
|
child: Divider(
|
||||||
|
color: Colors.grey[400],
|
||||||
|
thickness: 0.7,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
child: AppExpandableNotifier(
|
||||||
|
title: "Total Price: " + grandTotal.toString() + " SAR",
|
||||||
|
isExpand: true,
|
||||||
|
bodyWidget: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Table(
|
||||||
|
children: [
|
||||||
|
TableRow(children: [
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.only(top: 10.0),
|
||||||
|
child: Text("Discount: ",
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.black,
|
||||||
|
fontWeight: FontWeight.bold)),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.only(top: 10.0),
|
||||||
|
child: Text(totalDiscount.toString() + " SAR",
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.black,
|
||||||
|
fontWeight: FontWeight.bold)),
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
TableRow(children: [
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.only(top: 10.0),
|
||||||
|
child: Text(
|
||||||
|
"VAT (" +
|
||||||
|
dentalInvoiceDetailResponse
|
||||||
|
.listEInvoiceForDental[0]
|
||||||
|
.listConsultation[0]
|
||||||
|
.vATPercentage
|
||||||
|
.toString() +
|
||||||
|
"%)",
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.black,
|
||||||
|
fontWeight: FontWeight.bold)),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.only(top: 10.0),
|
||||||
|
child: Text(totalVAT.toString() + " SAR",
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.black,
|
||||||
|
fontWeight: FontWeight.bold)),
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
TableRow(children: [
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.only(top: 10.0),
|
||||||
|
child: Text("Total: ",
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.black,
|
||||||
|
fontWeight: FontWeight.bold)),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.only(top: 10.0),
|
||||||
|
child: Text(grandTotal.toString() + " SAR",
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.black,
|
||||||
|
fontWeight: FontWeight.bold)),
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
TableRow(children: [
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.only(top: 10.0),
|
||||||
|
child: Text("Paid: ",
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.black,
|
||||||
|
fontWeight: FontWeight.bold)),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
margin:
|
||||||
|
EdgeInsets.only(top: 10.0, bottom: 10.0),
|
||||||
|
child: Text(grandTotal.toString() + " SAR",
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.black,
|
||||||
|
fontWeight: FontWeight.bold)),
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.only(top: 3.0, left: 12.0, right: 12.0),
|
||||||
|
child: Divider(
|
||||||
|
color: Colors.grey[400],
|
||||||
|
thickness: 0.7,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.only(top: 0.0, left: 10.0, right: 10.0),
|
||||||
|
padding: EdgeInsets.only(
|
||||||
|
top: 10.0, left: 10.0, right: 10.0, bottom: 15.0),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.all(Radius.circular(8))),
|
||||||
|
child: Table(children: [
|
||||||
|
TableRow(children: [
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.only(top: 10.0),
|
||||||
|
child: Text("Insurance: ",
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.black,
|
||||||
|
fontWeight: FontWeight.bold)),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.only(top: 10.0, bottom: 5.0),
|
||||||
|
child: Text(
|
||||||
|
dentalInvoiceDetailResponse
|
||||||
|
.listEInvoiceForDental[0].companyName,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.black,
|
||||||
|
fontWeight: FontWeight.bold)),
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
TableRow(children: [
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.only(top: 10.0),
|
||||||
|
child: Text("Insurance ID: ",
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.black,
|
||||||
|
fontWeight: FontWeight.bold)),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.only(top: 10.0, bottom: 10.0),
|
||||||
|
child: Text(
|
||||||
|
dentalInvoiceDetailResponse
|
||||||
|
.listEInvoiceForDental[0].insuranceID,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.black,
|
||||||
|
fontWeight: FontWeight.bold)),
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 100.0,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
bottomSheet: Container(
|
||||||
|
width: MediaQuery.of(context).size.width,
|
||||||
|
height: 70.0,
|
||||||
|
margin: EdgeInsets.only(left: 15.0, right: 15.0, top: 10.0),
|
||||||
|
child: Button(
|
||||||
|
onTap: () {
|
||||||
|
sendInvoiceEmail();
|
||||||
|
},
|
||||||
|
label: TranslationBase.of(context).sendEmail,
|
||||||
|
backgroundColor: Colors.red[900],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
sendInvoiceEmail() {
|
||||||
|
GifLoaderDialogUtils.showMyDialog(context);
|
||||||
|
MyInvoicesService myInvoicesService = new MyInvoicesService();
|
||||||
|
|
||||||
|
myInvoicesService
|
||||||
|
.sendDentalAppointmentInvoiceEmail(
|
||||||
|
12, listDentalAppointments.appointmentNo, context)
|
||||||
|
.then((res) {
|
||||||
|
GifLoaderDialogUtils.hideDialog(context);
|
||||||
|
if (res['MessageStatus'] == 1) {
|
||||||
|
AppToast.showSuccessToast(
|
||||||
|
message: TranslationBase.of(context).emailSentSuccessfully);
|
||||||
|
} else {
|
||||||
|
AppToast.showErrorToast(message: res['ErrorEndUserMessage']);
|
||||||
|
}
|
||||||
|
}).catchError((err) {
|
||||||
|
GifLoaderDialogUtils.hideDialog(context);
|
||||||
|
print(err);
|
||||||
|
AppToast.showErrorToast(message: err);
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
List<TableRow> fullData(context) {
|
||||||
|
List<TableRow> tableRow = [];
|
||||||
|
dentalInvoiceDetailResponse.listEInvoiceForDental[0].listConsultation
|
||||||
|
.forEach((lab) {
|
||||||
|
tableRow.add(
|
||||||
|
TableRow(children: [
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.only(top: 10.0),
|
||||||
|
child: Text(lab.procedureName,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.black, fontWeight: FontWeight.w400)),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.only(top: 10.0),
|
||||||
|
child: Text(lab.quantity.toString(),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.black, fontWeight: FontWeight.w400)),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.only(top: 10.0),
|
||||||
|
child: Text(lab.price.toString() + " SAR",
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.black, fontWeight: FontWeight.w400)),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.only(top: 10.0),
|
||||||
|
child: Text(lab.total.toString() + " SAR",
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.black, fontWeight: FontWeight.w400)),
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
return tableRow;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,256 @@
|
|||||||
|
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
|
||||||
|
import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart'
|
||||||
|
as DoctorListResponse;
|
||||||
|
import 'package:diplomaticquarterapp/models/MyInvoices/DentalInvoiceDetailResponse.dart';
|
||||||
|
import 'package:diplomaticquarterapp/models/MyInvoices/GetDentalAppointmentsResponse.dart';
|
||||||
|
import 'package:diplomaticquarterapp/pages/medical/my_invoices/invoice_detail_page.dart';
|
||||||
|
import 'package:diplomaticquarterapp/services/my_invoice_service/my_invoice_services.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
|
||||||
|
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
class MyInvoices extends StatefulWidget {
|
||||||
|
@override
|
||||||
|
_MyInvoicesState createState() => _MyInvoicesState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _MyInvoicesState extends State<MyInvoices> {
|
||||||
|
bool isDataLoaded = false;
|
||||||
|
GetDentalAppointmentsResponse getDentalAppointmentsResponse;
|
||||||
|
DentalInvoiceDetailResponse dentalInvoiceDetailResponse;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
|
getDentalAppointments();
|
||||||
|
});
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
ProjectViewModel projectViewModel = Provider.of(context);
|
||||||
|
return AppScaffold(
|
||||||
|
appBarTitle: TranslationBase.of(context).myInvoice,
|
||||||
|
isShowAppBar: true,
|
||||||
|
isShowDecPage: true,
|
||||||
|
body: Container(
|
||||||
|
child: SingleChildScrollView(
|
||||||
|
physics: BouncingScrollPhysics(),
|
||||||
|
child: isDataLoaded
|
||||||
|
? Column(
|
||||||
|
children: [
|
||||||
|
...List.generate(
|
||||||
|
getDentalAppointmentsResponse
|
||||||
|
.listDentalAppointments.length,
|
||||||
|
(index) => InkWell(
|
||||||
|
onTap: () {
|
||||||
|
openInvoiceDetailsPage(getDentalAppointmentsResponse
|
||||||
|
.listDentalAppointments[index]);
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius:
|
||||||
|
BorderRadius.all(Radius.circular(8.0)),
|
||||||
|
),
|
||||||
|
margin: EdgeInsets.all(10.0),
|
||||||
|
width: MediaQuery.of(context).size.width,
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
child: Container(
|
||||||
|
margin: EdgeInsets.fromLTRB(
|
||||||
|
20.0, 10.0, 20.0, 10.0),
|
||||||
|
child: ClipRRect(
|
||||||
|
borderRadius:
|
||||||
|
BorderRadius.circular(100.0),
|
||||||
|
child: Image.asset(
|
||||||
|
"assets/images/new-design/ViewDetailsIco.png",
|
||||||
|
fit: BoxFit.fill,
|
||||||
|
height: 60.0,
|
||||||
|
width: 60.0),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.only(top: 10.0),
|
||||||
|
child: Text("Appointment No: ",
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 14.0,
|
||||||
|
color: Colors.black,
|
||||||
|
letterSpacing: 0.5)),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.only(top: 10.0),
|
||||||
|
child: Text("Appointment Date: ",
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 14.0,
|
||||||
|
color: Colors.black,
|
||||||
|
letterSpacing: 0.5)),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.only(
|
||||||
|
top: 10.0, bottom: 10.0),
|
||||||
|
child: Text("Clinic: ",
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 14.0,
|
||||||
|
color: Colors.black,
|
||||||
|
letterSpacing: 0.5)),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.only(top: 10.0),
|
||||||
|
child: Text(
|
||||||
|
getDentalAppointmentsResponse
|
||||||
|
.listDentalAppointments[index]
|
||||||
|
.appointmentNo
|
||||||
|
.toString(),
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 14.0,
|
||||||
|
color: Colors.black,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
letterSpacing: 0.5)),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.only(top: 10.0),
|
||||||
|
child: Text(
|
||||||
|
DateUtil.getMonthDayYearDateFormatted(
|
||||||
|
DateUtil.convertStringToDate(
|
||||||
|
getDentalAppointmentsResponse
|
||||||
|
.listDentalAppointments[
|
||||||
|
index]
|
||||||
|
.appointmentDate)),
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 14.0,
|
||||||
|
color: Colors.black,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
letterSpacing: 0.5)),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
margin: EdgeInsets.only(
|
||||||
|
top: 10.0, bottom: 10.0),
|
||||||
|
child: Text(
|
||||||
|
getDentalAppointmentsResponse
|
||||||
|
.listDentalAppointments[index]
|
||||||
|
.clinicName,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 14.0,
|
||||||
|
color: Colors.black,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
letterSpacing: 0.5)),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
projectViewModel.isArabic
|
||||||
|
? Container(
|
||||||
|
margin: EdgeInsets.only(left: 15.0),
|
||||||
|
child: Image.asset(
|
||||||
|
"assets/images/new-design/arrow_menu_black-ar.png",
|
||||||
|
fit: BoxFit.fill,
|
||||||
|
height: 20.0,
|
||||||
|
width: 12.0),
|
||||||
|
)
|
||||||
|
: Container(
|
||||||
|
margin: EdgeInsets.only(right: 15.0),
|
||||||
|
child: Image.asset(
|
||||||
|
"assets/images/new-design/arrow_menu_black-en.png",
|
||||||
|
fit: BoxFit.fill,
|
||||||
|
height: 20.0,
|
||||||
|
width: 12.0),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
: Container(),
|
||||||
|
),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
openInvoiceDetailsPage(ListDentalAppointments listDentalAppointments) {
|
||||||
|
GifLoaderDialogUtils.showMyDialog(context);
|
||||||
|
MyInvoicesService myInvoicesService = new MyInvoicesService();
|
||||||
|
|
||||||
|
DoctorListResponse.DoctorList doctor = new DoctorListResponse.DoctorList();
|
||||||
|
|
||||||
|
doctor.name = listDentalAppointments.doctorName;
|
||||||
|
doctor.projectName = listDentalAppointments.projectName;
|
||||||
|
doctor.date = listDentalAppointments.appointmentDate;
|
||||||
|
doctor.actualDoctorRate = 0;
|
||||||
|
doctor.doctorImageURL = listDentalAppointments.doctorImageURL;
|
||||||
|
doctor.dayName = listDentalAppointments.invoiceNo;
|
||||||
|
doctor.doctorTitle = "Dr.";
|
||||||
|
doctor.clinicName = "InvoiceNo: " + listDentalAppointments.invoiceNo.toString();
|
||||||
|
|
||||||
|
myInvoicesService.getDentalAppointmentInvoice(12, listDentalAppointments.appointmentNo, context).then((res) {
|
||||||
|
GifLoaderDialogUtils.hideDialog(context);
|
||||||
|
setState(() {
|
||||||
|
if (res['MessageStatus'] == 1) {
|
||||||
|
dentalInvoiceDetailResponse =
|
||||||
|
DentalInvoiceDetailResponse.fromJson(res);
|
||||||
|
print(dentalInvoiceDetailResponse.listEInvoiceForDental[0].listConsultation.length);
|
||||||
|
Navigator.push(
|
||||||
|
context,
|
||||||
|
FadePage(
|
||||||
|
page: InvoiceDetail(
|
||||||
|
doctor,
|
||||||
|
listDentalAppointments,
|
||||||
|
dentalInvoiceDetailResponse,
|
||||||
|
context
|
||||||
|
)));
|
||||||
|
} else {
|
||||||
|
AppToast.showErrorToast(message: res['ErrorEndUserMessage']);
|
||||||
|
}
|
||||||
|
isDataLoaded = true;
|
||||||
|
});
|
||||||
|
}).catchError((err) {
|
||||||
|
GifLoaderDialogUtils.hideDialog(context);
|
||||||
|
print(err);
|
||||||
|
AppToast.showErrorToast(message: err.toString());
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getDentalAppointments() {
|
||||||
|
GifLoaderDialogUtils.showMyDialog(context);
|
||||||
|
MyInvoicesService myInvoicesService = new MyInvoicesService();
|
||||||
|
|
||||||
|
myInvoicesService.getAllDentalAppointments(12, context).then((res) {
|
||||||
|
GifLoaderDialogUtils.hideDialog(context);
|
||||||
|
setState(() {
|
||||||
|
if (res['MessageStatus'] == 1) {
|
||||||
|
getDentalAppointmentsResponse =
|
||||||
|
GetDentalAppointmentsResponse.fromJson(res);
|
||||||
|
} else {
|
||||||
|
AppToast.showErrorToast(message: res['ErrorEndUserMessage']);
|
||||||
|
}
|
||||||
|
isDataLoaded = true;
|
||||||
|
});
|
||||||
|
}).catchError((err) {
|
||||||
|
GifLoaderDialogUtils.hideDialog(context);
|
||||||
|
print(err);
|
||||||
|
AppToast.showErrorToast(message: err);
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,121 @@
|
|||||||
|
import 'package:diplomaticquarterapp/config/config.dart';
|
||||||
|
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
|
||||||
|
import 'package:diplomaticquarterapp/core/service/base_service.dart';
|
||||||
|
import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart';
|
||||||
|
import 'package:diplomaticquarterapp/models/Request.dart';
|
||||||
|
import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart';
|
||||||
|
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
|
||||||
|
|
||||||
|
class MyInvoicesService extends BaseService {
|
||||||
|
AppSharedPreferences sharedPref = AppSharedPreferences();
|
||||||
|
AppGlobal appGlobal = new AppGlobal();
|
||||||
|
|
||||||
|
AuthenticatedUser authUser = new AuthenticatedUser();
|
||||||
|
AuthProvider authProvider = new AuthProvider();
|
||||||
|
|
||||||
|
Future<Map> getAllDentalAppointments(int projectID, context) async {
|
||||||
|
Map<String, dynamic> request;
|
||||||
|
var languageID =
|
||||||
|
await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar');
|
||||||
|
Request req = appGlobal.getPublicRequest();
|
||||||
|
request = {
|
||||||
|
"LanguageID": languageID == 'ar' ? 1 : 2,
|
||||||
|
"IPAdress": "10.20.10.20",
|
||||||
|
"VersionID": req.VersionID,
|
||||||
|
"Channel": req.Channel,
|
||||||
|
"generalid": 'Cs2020@2016\$2958',
|
||||||
|
"PatientOutSA": authUser.outSA,
|
||||||
|
"DeviceTypeID": req.DeviceTypeID,
|
||||||
|
"SessionID": null,
|
||||||
|
"PatientID": authUser.patientID,
|
||||||
|
"License": true,
|
||||||
|
"IsRegistered": true,
|
||||||
|
"ProjectID": projectID,
|
||||||
|
"PatientTypeID": authUser.patientIdentificationType,
|
||||||
|
"PatientType": authUser.patientType,
|
||||||
|
"isDentalAllowedBackend": false
|
||||||
|
};
|
||||||
|
|
||||||
|
dynamic localRes;
|
||||||
|
|
||||||
|
await baseAppClient.post(GET_ALL_APPOINTMENTS_FOR_DENTAL_CLINIC,
|
||||||
|
onSuccess: (response, statusCode) async {
|
||||||
|
localRes = response;
|
||||||
|
}, onFailure: (String error, int statusCode) {
|
||||||
|
throw error;
|
||||||
|
}, body: request);
|
||||||
|
return Future.value(localRes);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<Map> getDentalAppointmentInvoice(int projectID, int appoNo, context) async {
|
||||||
|
Map<String, dynamic> request;
|
||||||
|
var languageID =
|
||||||
|
await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar');
|
||||||
|
Request req = appGlobal.getPublicRequest();
|
||||||
|
request = {
|
||||||
|
"LanguageID": languageID == 'ar' ? 1 : 2,
|
||||||
|
"IPAdress": "10.20.10.20",
|
||||||
|
"VersionID": req.VersionID,
|
||||||
|
"Channel": req.Channel,
|
||||||
|
"generalid": 'Cs2020@2016\$2958',
|
||||||
|
"PatientOutSA": authUser.outSA,
|
||||||
|
"DeviceTypeID": req.DeviceTypeID,
|
||||||
|
"SessionID": null,
|
||||||
|
"PatientID": authUser.patientID,
|
||||||
|
"License": true,
|
||||||
|
"AppointmentNo": appoNo,
|
||||||
|
"IsRegistered": true,
|
||||||
|
"ProjectID": projectID,
|
||||||
|
"PatientTypeID": authUser.patientIdentificationType,
|
||||||
|
"PatientType": authUser.patientType,
|
||||||
|
"isDentalAllowedBackend": false
|
||||||
|
};
|
||||||
|
|
||||||
|
dynamic localRes;
|
||||||
|
|
||||||
|
await baseAppClient.post(GET_DENTAL_APPOINTMENT_INVOICE,
|
||||||
|
onSuccess: (response, statusCode) async {
|
||||||
|
localRes = response;
|
||||||
|
}, onFailure: (String error, int statusCode) {
|
||||||
|
throw error;
|
||||||
|
}, body: request);
|
||||||
|
return Future.value(localRes);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<Map> sendDentalAppointmentInvoiceEmail(int projectID, int appoNo, context) async {
|
||||||
|
Map<String, dynamic> request;
|
||||||
|
var languageID =
|
||||||
|
await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar');
|
||||||
|
Request req = appGlobal.getPublicRequest();
|
||||||
|
request = {
|
||||||
|
"LanguageID": languageID == 'ar' ? 1 : 2,
|
||||||
|
"IPAdress": "10.20.10.20",
|
||||||
|
"VersionID": req.VersionID,
|
||||||
|
"Channel": req.Channel,
|
||||||
|
"generalid": 'Cs2020@2016\$2958',
|
||||||
|
"PatientOutSA": authUser.outSA,
|
||||||
|
"DeviceTypeID": req.DeviceTypeID,
|
||||||
|
"SessionID": null,
|
||||||
|
"PatientID": authUser.patientID,
|
||||||
|
"License": true,
|
||||||
|
"AppointmentNo": appoNo,
|
||||||
|
"To": authUser.emailAddress,
|
||||||
|
"IsRegistered": true,
|
||||||
|
"ProjectID": projectID,
|
||||||
|
"PatientTypeID": authUser.patientIdentificationType,
|
||||||
|
"PatientType": authUser.patientType,
|
||||||
|
"isDentalAllowedBackend": false
|
||||||
|
};
|
||||||
|
|
||||||
|
dynamic localRes;
|
||||||
|
|
||||||
|
await baseAppClient.post(SEND_DENTAL_APPOINTMENT_INVOICE_EMAIL,
|
||||||
|
onSuccess: (response, statusCode) async {
|
||||||
|
localRes = response;
|
||||||
|
}, onFailure: (String error, int statusCode) {
|
||||||
|
throw error;
|
||||||
|
}, body: request);
|
||||||
|
return Future.value(localRes);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,56 @@
|
|||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class SelectionDialog<T> extends StatefulWidget{
|
||||||
|
@override
|
||||||
|
State<StatefulWidget> createState() => SelectionDialogState();
|
||||||
|
|
||||||
|
String title;
|
||||||
|
List<T> items;
|
||||||
|
show({@required String title, @required List<T> items}){
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class SelectionDialogState extends State<SelectionDialog>{
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(15)),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.all(15),
|
||||||
|
child: Text(widget.title,),
|
||||||
|
),
|
||||||
|
|
||||||
|
Container(height: 0.5, color: Colors.grey,),
|
||||||
|
|
||||||
|
ListView.separated(
|
||||||
|
padding: EdgeInsets.all(10),
|
||||||
|
itemCount: widget.items.length,
|
||||||
|
itemBuilder: (ctx,idx) => item(idx),
|
||||||
|
separatorBuilder: (ctx,idx) => Container(height: 0.25, color: Colors.grey.withOpacity(0.7),))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget item(int idx){
|
||||||
|
var model = widget.items[idx];
|
||||||
|
return Container(
|
||||||
|
padding: EdgeInsets.all(10),
|
||||||
|
height: 20,
|
||||||
|
color: Colors.blue,
|
||||||
|
child: Text(model.toString()),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue