Merge branch 'development_v3.3' into PatientApp_VIDA_Plus_3.3

# Conflicts:
#	lib/config/config.dart
#	lib/core/model/labs/request_send_lab_report_email.dart
#	lib/core/service/medical/ask_doctor_services.dart
#	lib/core/service/medical/labs_service.dart
#	lib/core/viewModels/medical/labs_view_model.dart
#	lib/pages/conference/web_rtc/call_home_page_.dart
#	lib/pages/medical/labs/laboratory_result_page.dart
#	lib/pages/medical/patient_sick_leave_page.dart
#	lib/pages/webRTC/call_page.dart
#	lib/pages/webRTC/signaling.dart
#	lib/services/appointment_services/GetDoctorsList.dart
#	lib/uitl/LocalNotification.dart
#	lib/uitl/SignalRUtil.dart
#	lib/uitl/utils.dart
#	lib/widgets/others/floating_button_search.dart
PatientApp_VIDA_Plus_3.3
haroon amjad 2 years ago
commit 4e962bda07

@ -0,0 +1,6 @@
-----BEGIN PRIVATE KEY-----
MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgJ5XRSnefd1apSG/z
YJTQ55ffLMlPgKlGM9edg88mUZagCgYIKoZIzj0DAQehRANCAATSA2MbS+J0cQsc
uBU0xaoxOUgGvnHCQSEK4t22i8eeKPPhH6RHJhK1ugPvj+Eyadf7j6pn3QRonEJu
mIL+qvqC
-----END PRIVATE KEY-----

@ -6,6 +6,9 @@
In most cases you can leave this as-is, but you if you want to provide In most cases you can leave this as-is, but you if you want to provide
additional functionality it is fine to subclass or reimplement additional functionality it is fine to subclass or reimplement
FlutterApplication and put your custom class here. --> FlutterApplication and put your custom class here. -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/> <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

@ -30,12 +30,12 @@ enum class GeofenceTransition(val value: Int) {
fun fromInt(value: Int) = GeofenceTransition.values().first { it.value == value } fun fromInt(value: Int) = GeofenceTransition.values().first { it.value == value }
} }
fun named():String{ fun named(): String {
if (value == 1)return "Enter" if (value == 1) return "Enter"
if (value == 2)return "Exit" if (value == 2) return "Exit"
if (value == 4)return "dWell" if (value == 4) return "dWell"
if (value == (ENTER.value or EXIT.value))return "Enter or Exit" if (value == (ENTER.value or EXIT.value)) return "Enter or Exit"
if (value == (DWELL.value or EXIT.value))return "DWell or Exit" if (value == (DWELL.value or EXIT.value)) return "DWell or Exit"
return "unknown" return "unknown"
} }
} }
@ -44,63 +44,65 @@ class HMG_Geofence {
// https://developer.android.com/training/location/geofencing#java // https://developer.android.com/training/location/geofencing#java
private lateinit var context: Context private lateinit var context: Context
private lateinit var preferences:SharedPreferences private lateinit var preferences: SharedPreferences
private val gson = Gson() private val gson = Gson()
private lateinit var geofencingClient:GeofencingClient private lateinit var geofencingClient: GeofencingClient
private val geofencePendingIntent: PendingIntent by lazy { private val geofencePendingIntent: PendingIntent by lazy {
val intent = Intent(context, GeofenceBroadcastReceiver::class.java) val intent = Intent(context, GeofenceBroadcastReceiver::class.java)
PendingIntent.getBroadcast( PendingIntent.getBroadcast(
context, context,
0, 0,
intent, intent,
PendingIntent.FLAG_UPDATE_CURRENT) PendingIntent.FLAG_IMMUTABLE
)
} }
companion object{ companion object {
var instance: HMG_Geofence? = null var instance: HMG_Geofence? = null
fun shared(context: Context) : HMG_Geofence { fun shared(context: Context): HMG_Geofence {
if (instance == null) { if (instance == null) {
instance = HMG_Geofence() instance = HMG_Geofence()
instance?.context = context instance?.context = context
instance?.geofencingClient = LocationServices.getGeofencingClient(context) instance?.geofencingClient = LocationServices.getGeofencingClient(context)
instance?.preferences = context.getSharedPreferences(PREFS_STORAGE, Context.MODE_PRIVATE) instance?.preferences =
context.getSharedPreferences(PREFS_STORAGE, Context.MODE_PRIVATE)
} }
return instance!! return instance!!
} }
} }
fun limitize(zones: List<GeoZoneModel>):List<GeoZoneModel>{ private fun limitize(zones: List<GeoZoneModel>): List<GeoZoneModel> {
var geoZones_ = zones var geoZones_ = zones
if(zones.size > 100) if (zones.size > 100)
geoZones_ = zones.subList(0, 99) geoZones_ = zones.subList(0, 99)
return geoZones_ return geoZones_
} }
fun register(completion:((Boolean, java.lang.Exception?)->Unit)){ fun register(completion: ((Boolean, java.lang.Exception?) -> Unit)) {
unRegisterAll { status, exception -> unRegisterAll { status, exception ->
val geoZones = getGeoZonesFromPreference(context) val geoZones = getGeoZonesFromPreference(context)
doRegister(geoZones){ status_, error -> doRegister(geoZones) { status_, error ->
completion.let { it(status_, error) } completion.let { it(status_, error) }
} }
} }
} }
fun unRegisterAll(completion: (status: Boolean, exception: Exception?) -> Unit){ fun unRegisterAll(completion: (status: Boolean, exception: Exception?) -> Unit) {
getActiveGeofences({ success -> getActiveGeofences({ success ->
removeActiveGeofences() removeActiveGeofences()
if(success.isNotEmpty()) if (success.isNotEmpty())
geofencingClient geofencingClient
.removeGeofences(success) .removeGeofences(success)
.addOnSuccessListener { .addOnSuccessListener {
completion(true, null) completion(true, null)
} }
.addOnFailureListener { .addOnFailureListener {
completion(false, it) completion(false, it)
saveLog(context, "error:REMOVE_GEOFENCES", it.localizedMessage) saveLog(context, "error:REMOVE_GEOFENCES", it.localizedMessage)
} }
else else
completion(true, null) completion(true, null)
@ -109,7 +111,10 @@ class HMG_Geofence {
}) })
} }
private fun doRegister(geoZones: List<GeoZoneModel>, completion:((Boolean, java.lang.Exception?)->Unit)? = null){ private fun doRegister(
geoZones: List<GeoZoneModel>,
completion: ((Boolean, java.lang.Exception?) -> Unit)? = null
) {
if (geoZones.isEmpty()) if (geoZones.isEmpty())
return return
@ -117,9 +122,9 @@ class HMG_Geofence {
fun buildGeofencingRequest(geofences: List<Geofence>): GeofencingRequest { fun buildGeofencingRequest(geofences: List<Geofence>): GeofencingRequest {
return GeofencingRequest.Builder() return GeofencingRequest.Builder()
.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_DWELL) .setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_DWELL)
.addGeofences(geofences) .addGeofences(geofences)
.build() .build()
} }
getActiveGeofences({ active -> getActiveGeofences({ active ->
@ -135,26 +140,41 @@ class HMG_Geofence {
if (checkPermission() && geofences.isNotEmpty()) { if (checkPermission() && geofences.isNotEmpty()) {
geofencingClient geofencingClient
.addGeofences(buildGeofencingRequest(geofences), geofencePendingIntent) .addGeofences(buildGeofencingRequest(geofences), geofencePendingIntent)
.addOnSuccessListener { .addOnSuccessListener {
Logs.RegisterGeofence.save(context,"SUCCESS", "Successfuly registered the geofences", Logs.STATUS.SUCCESS) Logs.RegisterGeofence.save(
saveActiveGeofence(geofences.map { it.requestId }, listOf()) context,
completion?.let { it(true,null) } "SUCCESS",
} "Successfuly registered the geofences",
.addOnFailureListener { exc -> Logs.STATUS.SUCCESS
Logs.RegisterGeofence.save(context,"FAILED_TO_REGISTER", "Failed to register geofence",Logs.STATUS.ERROR) )
completion?.let { it(false,exc) } saveActiveGeofence(geofences.map { it.requestId }, listOf())
} completion?.let { it(true, null) }
}
.addOnFailureListener { exc ->
Logs.RegisterGeofence.save(
context,
"FAILED_TO_REGISTER",
"Failed to register geofence",
Logs.STATUS.ERROR
)
completion?.let { it(false, exc) }
}
// Schedule the job to register after specified duration (due to: events not calling after long period.. days or days [Needs to register fences again]) // Schedule the job to register after specified duration (due to: events not calling after long period.. days or days [Needs to register fences again])
HMGUtils.scheduleJob(context, ReregisterGeofenceJobService::class.java,ReregisterGeofenceJobService.JobID, ReregisterGeofenceJobService.TriggerIntervalDuration) HMGUtils.scheduleJob(
context,
ReregisterGeofenceJobService::class.java,
ReregisterGeofenceJobService.JobID,
ReregisterGeofenceJobService.TriggerIntervalDuration
)
} }
}, null) }, null)
} }
fun getGeoZonesFromPreference(context: Context):List<GeoZoneModel>{ fun getGeoZonesFromPreference(context: Context): List<GeoZoneModel> {
val pref = context.getSharedPreferences(PREFS_STORAGE, Context.MODE_PRIVATE) val pref = context.getSharedPreferences(PREFS_STORAGE, Context.MODE_PRIVATE)
val json = pref.getString(PREF_KEY_HMG_ZONES, "[]") val json = pref.getString(PREF_KEY_HMG_ZONES, "[]")
@ -162,26 +182,29 @@ class HMG_Geofence {
return geoZones return geoZones
} }
fun saveActiveGeofence(success: List<String>, failed: List<String>){ fun saveActiveGeofence(success: List<String>, failed: List<String>) {
val jsonSuccess = gson.toJson(success) val jsonSuccess = gson.toJson(success)
val jsonFailure = gson.toJson(failed) val jsonFailure = gson.toJson(failed)
preferences.edit().putString(PREF_KEY_SUCCESS, jsonSuccess).apply() preferences.edit().putString(PREF_KEY_SUCCESS, jsonSuccess).apply()
preferences.edit().putString(PREF_KEY_FAILED, jsonFailure).apply() preferences.edit().putString(PREF_KEY_FAILED, jsonFailure).apply()
} }
fun removeActiveGeofences(){ fun removeActiveGeofences() {
preferences.edit().putString(PREF_KEY_SUCCESS, "[]").apply() preferences.edit().putString(PREF_KEY_SUCCESS, "[]").apply()
preferences.edit().putString(PREF_KEY_FAILED, "[]").apply() preferences.edit().putString(PREF_KEY_FAILED, "[]").apply()
} }
fun getActiveGeofences(success: (success: List<String>) -> Unit, failure: ((failed: List<String>) -> Unit)?){ fun getActiveGeofences(
val type = object : TypeToken<List<String?>?>() {}.type success: (success: List<String>) -> Unit,
failure: ((failed: List<String>) -> Unit)?
) {
val type = object : TypeToken<List<String?>?>() {}.type
val jsonSuccess = preferences.getString(PREF_KEY_SUCCESS, "[]") val jsonSuccess = preferences.getString(PREF_KEY_SUCCESS, "[]")
val success = gson.fromJson<List<String>>(jsonSuccess, type) val success = gson.fromJson<List<String>>(jsonSuccess, type)
success(success) success(success)
if(failure != null){ if (failure != null) {
val jsonFailure = preferences.getString(PREF_KEY_FAILED, "[]") val jsonFailure = preferences.getString(PREF_KEY_FAILED, "[]")
val failed = gson.fromJson<List<String>>(jsonFailure, type) val failed = gson.fromJson<List<String>>(jsonFailure, type)
failure(failed) failure(failed)
@ -189,47 +212,74 @@ class HMG_Geofence {
} }
private fun checkPermission() : Boolean{ private fun checkPermission(): Boolean {
return ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED return ContextCompat.checkSelfPermission(
context,
Manifest.permission.ACCESS_FINE_LOCATION
) == PackageManager.PERMISSION_GRANTED
} }
fun getPatientID():Int?{ fun getPatientID(): Int? {
var profileJson = preferences.getString("flutter.imei-user-data", null) var profileJson = preferences.getString("flutter.imei-user-data", null)
if (profileJson == null) if (profileJson == null)
profileJson = preferences.getString("flutter.user-profile", null) profileJson = preferences.getString("flutter.user-profile", null)
val type = object : TypeToken<Map<String?, Any?>?>() {}.type val type = object : TypeToken<Map<String?, Any?>?>() {}.type
return gson.fromJson<Map<String?, Any?>?>(profileJson, type) return gson.fromJson<Map<String?, Any?>?>(profileJson, type)
?.get("PatientID") ?.get("PatientID")
.toString() .toString()
.toDoubleOrNull() .toDoubleOrNull()
?.toInt() ?.toInt()
} }
fun handleEvent(triggerGeofences: List<Geofence>, location: Location, transition: GeofenceTransition) { fun handleEvent(
triggerGeofences: List<Geofence>,
location: Location,
transition: GeofenceTransition
) {
getPatientID()?.let { patientId -> getPatientID()?.let { patientId ->
getActiveGeofences({ activeGeofences -> getActiveGeofences({ activeGeofences ->
triggerGeofences.forEach { geofence -> triggerGeofences.forEach { geofence ->
// Extract PointID from 'geofence.requestId' and find from active geofences // Extract PointID from 'geofence.requestId' and find from active geofences
val pointID = activeGeofences.firstOrNull { it == geofence.requestId }?.split('_')?.first() val pointID =
activeGeofences.firstOrNull { it == geofence.requestId }?.split('_')
?.first()
if (!pointID.isNullOrEmpty() && pointID.toIntOrNull() != null) { if (!pointID.isNullOrEmpty() && pointID.toIntOrNull() != null) {
val body = mutableMapOf<String, Any?>( val body = mutableMapOf<String, Any?>(
"PointsID" to pointID.toIntOrNull(), "PointsID" to pointID.toIntOrNull(),
"GeoType" to transition.value, "GeoType" to transition.value,
"PatientID" to patientId "PatientID" to patientId
) )
body.putAll(HMGUtils.defaultHTTPParams(context)) body.putAll(HMGUtils.defaultHTTPParams(context))
httpPost<Map<String, Any>>(API.LOG_GEOFENCE, body, { response -> httpPost<Map<String, Any>>(API.LOG_GEOFENCE, body, { response ->
saveLog(context, "HMG_GEOFENCE_NOTIFY", "Success: Notified to server\uD83D\uDE0E.") saveLog(
sendNotification(context, transition.named(), geofence.requestId, "Notified to server.😎") context,
"HMG_GEOFENCE_NOTIFY",
"Success: Notified to server\uD83D\uDE0E."
)
sendNotification(
context,
transition.named(),
geofence.requestId,
"Notified to server.😎"
)
}, { exception -> }, { exception ->
val errorMessage = "${transition.named()}, ${geofence.requestId}" val errorMessage = "${transition.named()}, ${geofence.requestId}"
saveLog(context, "HMG_GEOFENCE_NOTIFY", "failed: $errorMessage | error: ${exception.localizedMessage}") saveLog(
sendNotification(context, transition.named(), geofence.requestId, "Failed to notify server😔 -> ${exception.localizedMessage}") context,
"HMG_GEOFENCE_NOTIFY",
"failed: $errorMessage | error: ${exception.localizedMessage}"
)
sendNotification(
context,
transition.named(),
geofence.requestId,
"Failed to notify server😔 -> ${exception.localizedMessage}"
)
}) })
} }

@ -32,6 +32,7 @@ target 'Runner' do
use_modular_headers! use_modular_headers!
pod 'OpenTok', '~> 2.22.0' pod 'OpenTok', '~> 2.22.0'
pod 'VTO2Lib'
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end end
@ -53,9 +54,34 @@ post_install do |installer|
] ]
build_configuration.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64 i386' build_configuration.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64 i386'
build_configuration.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0' build_configuration.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0'
xcconfig_path = build_configuration.base_configuration_reference.real_path
xcconfig = File.read(xcconfig_path)
xcconfig_mod = xcconfig.gsub(/DT_TOOLCHAIN_DIR/, "TOOLCHAIN_DIR")
File.open(xcconfig_path, "w") { |file| file << xcconfig_mod }
if build_configuration.build_settings['WRAPPER_EXTENSION'] == 'bundle' if build_configuration.build_settings['WRAPPER_EXTENSION'] == 'bundle'
build_configuration.build_settings['DEVELOPMENT_TEAM'] = '3A359E86ZF' build_configuration.build_settings['DEVELOPMENT_TEAM'] = '3A359E86ZF'
end end
end end
end end
end
post_integrate do |installer|
compiler_flags_key = 'COMPILER_FLAGS'
project_path = 'Pods/Pods.xcodeproj'
project = Xcodeproj::Project.open(project_path)
project.targets.each do |target|
target.build_phases.each do |build_phase|
if build_phase.is_a?(Xcodeproj::Project::Object::PBXSourcesBuildPhase)
build_phase.files.each do |file|
if !file.settings.nil? && file.settings.key?(compiler_flags_key)
compiler_flags = file.settings[compiler_flags_key]
file.settings[compiler_flags_key] = compiler_flags.gsub(/-DOS_OBJECT_USE_OBJC=0\s*/, '')
end
end
end
end
end
project.save()
end end

@ -13,6 +13,7 @@
306FE6C8271D790C002D6EFC /* OpenTokPlatformBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 306FE6C7271D790C002D6EFC /* OpenTokPlatformBridge.swift */; }; 306FE6C8271D790C002D6EFC /* OpenTokPlatformBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 306FE6C7271D790C002D6EFC /* OpenTokPlatformBridge.swift */; };
306FE6CB271D8B73002D6EFC /* OpenTok.swift in Sources */ = {isa = PBXBuildFile; fileRef = 306FE6CA271D8B73002D6EFC /* OpenTok.swift */; }; 306FE6CB271D8B73002D6EFC /* OpenTok.swift in Sources */ = {isa = PBXBuildFile; fileRef = 306FE6CA271D8B73002D6EFC /* OpenTok.swift */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
4EE411B2E3CB5D4F81AE5078 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D1513E0724DAFB89C198BDD /* Pods_Runner.framework */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
762D738E274E42650063CE73 /* ring_30Sec.caf in Resources */ = {isa = PBXBuildFile; fileRef = 762D738C274E42650063CE73 /* ring_30Sec.caf */; }; 762D738E274E42650063CE73 /* ring_30Sec.caf in Resources */ = {isa = PBXBuildFile; fileRef = 762D738C274E42650063CE73 /* ring_30Sec.caf */; };
762D738F274E42650063CE73 /* ring_30Sec.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 762D738D274E42650063CE73 /* ring_30Sec.mp3 */; }; 762D738F274E42650063CE73 /* ring_30Sec.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 762D738D274E42650063CE73 /* ring_30Sec.mp3 */; };
@ -22,7 +23,6 @@
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
B40C32A62DF065A3A0414845 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B99ADD0B93AC14DD8D0BAB0 /* Pods_Runner.framework */; };
E91B5396256AAA6500E96549 /* GlobalHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = E91B538D256AAA6500E96549 /* GlobalHelper.swift */; }; E91B5396256AAA6500E96549 /* GlobalHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = E91B538D256AAA6500E96549 /* GlobalHelper.swift */; };
E91B5397256AAA6500E96549 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E91B538E256AAA6500E96549 /* Extensions.swift */; }; E91B5397256AAA6500E96549 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E91B538E256AAA6500E96549 /* Extensions.swift */; };
E91B5398256AAA6500E96549 /* API.swift in Sources */ = {isa = PBXBuildFile; fileRef = E91B538F256AAA6500E96549 /* API.swift */; }; E91B5398256AAA6500E96549 /* API.swift in Sources */ = {isa = PBXBuildFile; fileRef = E91B538F256AAA6500E96549 /* API.swift */; };
@ -63,6 +63,8 @@
306FE6C7271D790C002D6EFC /* OpenTokPlatformBridge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenTokPlatformBridge.swift; sourceTree = "<group>"; }; 306FE6C7271D790C002D6EFC /* OpenTokPlatformBridge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenTokPlatformBridge.swift; sourceTree = "<group>"; };
306FE6CA271D8B73002D6EFC /* OpenTok.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenTok.swift; sourceTree = "<group>"; }; 306FE6CA271D8B73002D6EFC /* OpenTok.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenTok.swift; sourceTree = "<group>"; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
3D1513E0724DAFB89C198BDD /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
6EE8819867EC2775AB578377 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
762D738C274E42650063CE73 /* ring_30Sec.caf */ = {isa = PBXFileReference; lastKnownFileType = file; name = ring_30Sec.caf; path = ../../assets/sounds/ring_30Sec.caf; sourceTree = "<group>"; }; 762D738C274E42650063CE73 /* ring_30Sec.caf */ = {isa = PBXFileReference; lastKnownFileType = file; name = ring_30Sec.caf; path = ../../assets/sounds/ring_30Sec.caf; sourceTree = "<group>"; };
@ -70,9 +72,8 @@
76815B26275F381C00E66E94 /* HealthKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = HealthKit.framework; path = System/Library/Frameworks/HealthKit.framework; sourceTree = SDKROOT; }; 76815B26275F381C00E66E94 /* HealthKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = HealthKit.framework; path = System/Library/Frameworks/HealthKit.framework; sourceTree = SDKROOT; };
76962ECD28AE5C10004EAE09 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; }; 76962ECD28AE5C10004EAE09 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; };
76F2556027F1FFED0062C1CD /* PassKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PassKit.framework; path = System/Library/Frameworks/PassKit.framework; sourceTree = SDKROOT; }; 76F2556027F1FFED0062C1CD /* PassKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PassKit.framework; path = System/Library/Frameworks/PassKit.framework; sourceTree = SDKROOT; };
7805E271E86E72F39E68ADCC /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
8B99ADD0B93AC14DD8D0BAB0 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 838788A2BEDC4910F4B029A6 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
@ -80,7 +81,6 @@
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
BC1BA79F1F6E9D7BE59D2AE4 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
E91B538D256AAA6500E96549 /* GlobalHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GlobalHelper.swift; sourceTree = "<group>"; }; E91B538D256AAA6500E96549 /* GlobalHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GlobalHelper.swift; sourceTree = "<group>"; };
E91B538E256AAA6500E96549 /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = "<group>"; }; E91B538E256AAA6500E96549 /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = "<group>"; };
E91B538F256AAA6500E96549 /* API.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = API.swift; sourceTree = "<group>"; }; E91B538F256AAA6500E96549 /* API.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = API.swift; sourceTree = "<group>"; };
@ -99,7 +99,7 @@
E9C8C135256BACDA00EFFB62 /* HMG_Guest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HMG_Guest.swift; sourceTree = "<group>"; }; E9C8C135256BACDA00EFFB62 /* HMG_Guest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HMG_Guest.swift; sourceTree = "<group>"; };
E9E27167256E3A4000F49B69 /* LocalizedFromFlutter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizedFromFlutter.swift; sourceTree = "<group>"; }; E9E27167256E3A4000F49B69 /* LocalizedFromFlutter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizedFromFlutter.swift; sourceTree = "<group>"; };
E9F7623A25922BCE00FB5CCF /* FlutterConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlutterConstants.swift; sourceTree = "<group>"; }; E9F7623A25922BCE00FB5CCF /* FlutterConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlutterConstants.swift; sourceTree = "<group>"; };
EBA301C32F4CA9F09D2D7713 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; }; F2C7D3C4718A1DED85DA3AD4 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
@ -110,7 +110,7 @@
76F2556127F1FFED0062C1CD /* PassKit.framework in Frameworks */, 76F2556127F1FFED0062C1CD /* PassKit.framework in Frameworks */,
76815B27275F381C00E66E94 /* HealthKit.framework in Frameworks */, 76815B27275F381C00E66E94 /* HealthKit.framework in Frameworks */,
E9620805255C2ED100D3A35D /* NetworkExtension.framework in Frameworks */, E9620805255C2ED100D3A35D /* NetworkExtension.framework in Frameworks */,
B40C32A62DF065A3A0414845 /* Pods_Runner.framework in Frameworks */, 4EE411B2E3CB5D4F81AE5078 /* Pods_Runner.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@ -133,7 +133,7 @@
76F2556027F1FFED0062C1CD /* PassKit.framework */, 76F2556027F1FFED0062C1CD /* PassKit.framework */,
76815B26275F381C00E66E94 /* HealthKit.framework */, 76815B26275F381C00E66E94 /* HealthKit.framework */,
E9620804255C2ED100D3A35D /* NetworkExtension.framework */, E9620804255C2ED100D3A35D /* NetworkExtension.framework */,
8B99ADD0B93AC14DD8D0BAB0 /* Pods_Runner.framework */, 3D1513E0724DAFB89C198BDD /* Pods_Runner.framework */,
); );
name = Frameworks; name = Frameworks;
sourceTree = "<group>"; sourceTree = "<group>";
@ -141,9 +141,9 @@
605039E5DDF72C245F9765FE /* Pods */ = { 605039E5DDF72C245F9765FE /* Pods */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
EBA301C32F4CA9F09D2D7713 /* Pods-Runner.debug.xcconfig */, F2C7D3C4718A1DED85DA3AD4 /* Pods-Runner.debug.xcconfig */,
7805E271E86E72F39E68ADCC /* Pods-Runner.release.xcconfig */, 838788A2BEDC4910F4B029A6 /* Pods-Runner.release.xcconfig */,
BC1BA79F1F6E9D7BE59D2AE4 /* Pods-Runner.profile.xcconfig */, 6EE8819867EC2775AB578377 /* Pods-Runner.profile.xcconfig */,
); );
path = Pods; path = Pods;
sourceTree = "<group>"; sourceTree = "<group>";
@ -246,15 +246,15 @@
isa = PBXNativeTarget; isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = ( buildPhases = (
A37FFD337A0067237A8DACD6 /* [CP] Check Pods Manifest.lock */, 6D0B2FE51DC05E2D0395E861 /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */, 9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */, 97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */, 97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */, 97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */, 9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
E1D6AED972DEFC56AA7DB402 /* [CP] Embed Pods Frameworks */, 487FDD6493EB9AE7D8E39485 /* [CP] Embed Pods Frameworks */,
541D1D49FBD13BE6BA6DA5BC /* [CP] Copy Pods Resources */, 4671D3CD126F6635F4B75A6E /* [CP] Copy Pods Resources */,
); );
buildRules = ( buildRules = (
); );
@ -334,7 +334,7 @@
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin\n"; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin\n";
}; };
541D1D49FBD13BE6BA6DA5BC /* [CP] Copy Pods Resources */ = { 4671D3CD126F6635F4B75A6E /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
@ -351,21 +351,24 @@
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
showEnvVarsInLog = 0; showEnvVarsInLog = 0;
}; };
9740EEB61CF901F6004384FC /* Run Script */ = { 487FDD6493EB9AE7D8E39485 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
inputPaths = ( inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
); );
name = "Run Script"; name = "[CP] Embed Pods Frameworks";
outputPaths = ( outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0;
}; };
A37FFD337A0067237A8DACD6 /* [CP] Check Pods Manifest.lock */ = { 6D0B2FE51DC05E2D0395E861 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
@ -387,22 +390,19 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0; showEnvVarsInLog = 0;
}; };
E1D6AED972DEFC56AA7DB402 /* [CP] Embed Pods Frameworks */ = { 9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
inputFileListPaths = ( inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
); );
name = "[CP] Embed Pods Frameworks"; name = "Run Script";
outputFileListPaths = ( outputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
showEnvVarsInLog = 0;
}; };
/* End PBXShellScriptBuildPhase section */ /* End PBXShellScriptBuildPhase section */
@ -538,7 +538,7 @@
"$(inherited)", "$(inherited)",
"$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Flutter",
); );
MARKETING_VERSION = 4.5.57; MARKETING_VERSION = 4.5.63;
PRODUCT_BUNDLE_IDENTIFIER = "com.HMG.HMG-Smartphone"; PRODUCT_BUNDLE_IDENTIFIER = "com.HMG.HMG-Smartphone";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
@ -682,7 +682,7 @@
"$(inherited)", "$(inherited)",
"$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Flutter",
); );
MARKETING_VERSION = 4.5.57; MARKETING_VERSION = 4.5.63;
PRODUCT_BUNDLE_IDENTIFIER = "com.HMG.HMG-Smartphone"; PRODUCT_BUNDLE_IDENTIFIER = "com.HMG.HMG-Smartphone";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
@ -720,7 +720,7 @@
"$(inherited)", "$(inherited)",
"$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Flutter",
); );
MARKETING_VERSION = 4.5.57; MARKETING_VERSION = 4.5.63;
PRODUCT_BUNDLE_IDENTIFIER = "com.HMG.HMG-Smartphone"; PRODUCT_BUNDLE_IDENTIFIER = "com.HMG.HMG-Smartphone";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";

@ -97,6 +97,7 @@ var COVID_PASSPORT_UPDATE = 'Services/Patients.svc/REST/Covid19_Certificate_Pass
var GET_PATIENT_PASSPORT_NUMBER = 'Services/Patients.svc/REST/Covid19_Certificate_GetPassport'; var GET_PATIENT_PASSPORT_NUMBER = 'Services/Patients.svc/REST/Covid19_Certificate_GetPassport';
var UPDATE_WORKPLACE_NAME = 'Services/Patients.svc/REST/ActivateSickLeave_FromVida'; var UPDATE_WORKPLACE_NAME = 'Services/Patients.svc/REST/ActivateSickLeave_FromVida';
var GET_SICKLEAVE_STATUS_ADMISSION_NO = 'Services/ChatBot_Service.svc/REST/GetSickLeaveStatusByAdmissionNo';
/// ///
var GET_PATIENT_ORDERS = 'Services/Patients.svc/REST/GetPatientRadOrders'; var GET_PATIENT_ORDERS = 'Services/Patients.svc/REST/GetPatientRadOrders';
@ -191,6 +192,8 @@ var SAVE_BLOOD_AGREEMENT = 'Services/PatientVarification.svc/REST/AddUserAgreeme
var REPORTS = 'Services/Doctors.svc/REST/GetPatientMedicalReportStatusInfo'; var REPORTS = 'Services/Doctors.svc/REST/GetPatientMedicalReportStatusInfo';
var INSERT_REQUEST_FOR_MEDICAL_REPORT = 'Services/Doctors.svc/REST/InsertRequestForMedicalReport'; var INSERT_REQUEST_FOR_MEDICAL_REPORT = 'Services/Doctors.svc/REST/InsertRequestForMedicalReport';
var SEND_MEDICAL_REPORT_EMAIL = 'Services/Notifications.svc/REST/SendMedicalReportEmail'; var SEND_MEDICAL_REPORT_EMAIL = 'Services/Notifications.svc/REST/SendMedicalReportEmail';
var GET_INPATIENT_ADMISSIONS = 'Services/inps.svc/REST/getAdmissionForMedicalReport';
var GET_MEDICAL_REPORT_PDF = 'Services/inps.svc/REST/getMedicalReportPDF';
///Rate ///Rate
// var IS_LAST_APPOITMENT_RATED = 'Services/Doctors.svc/REST/IsLastAppoitmentRated'; // var IS_LAST_APPOITMENT_RATED = 'Services/Doctors.svc/REST/IsLastAppoitmentRated';
@ -332,7 +335,7 @@ var UPDATE_COVID_QUESTIONNAIRE = 'Services/Doctors.svc/REST/COVID19_Questionnari
var CHANNEL = 3; var CHANNEL = 3;
var GENERAL_ID = 'Cs2020@2016\$2958'; var GENERAL_ID = 'Cs2020@2016\$2958';
var IP_ADDRESS = '10.20.10.20'; var IP_ADDRESS = '10.20.10.20';
var VERSION_ID = 10.4; var VERSION_ID = 10.9;
var SETUP_ID = '91877'; var SETUP_ID = '91877';
var LANGUAGE = 2; var LANGUAGE = 2;
// var PATIENT_OUT_SA = 0; // var PATIENT_OUT_SA = 0;
@ -409,6 +412,8 @@ var ADD_ACTIVE_PRESCRIPTIONS_REPORT_BY_PATIENT_ID = 'Services/Patients.svc/Rest/
var GET_CALL_INFO_HOURS_RESULT = 'Services/Doctors.svc/REST/GetCallInfoHoursResult'; var GET_CALL_INFO_HOURS_RESULT = 'Services/Doctors.svc/REST/GetCallInfoHoursResult';
var GET_CALL_REQUEST_TYPE_LOV = 'Services/Doctors.svc/REST/GetCallRequestType_LOV'; var GET_CALL_REQUEST_TYPE_LOV = 'Services/Doctors.svc/REST/GetCallRequestType_LOV';
var GET_QUESTION_TYPES = 'Services/OUTPs.svc/REST/getQuestionsTypes';
var UPDATE_DIABETIC_RESULT = 'Services/Patients.svc/REST/Patient_UpdateDiabeticResult'; var UPDATE_DIABETIC_RESULT = 'Services/Patients.svc/REST/Patient_UpdateDiabeticResult';
var SEND_AVERAGE_BLOOD_SUGAR_REPORT = 'Services/Notifications.svc/REST/SendAverageBloodSugarReport'; var SEND_AVERAGE_BLOOD_SUGAR_REPORT = 'Services/Notifications.svc/REST/SendAverageBloodSugarReport';
@ -423,7 +428,10 @@ var UPDATE_WEIGHT_PRESSURE_RESULT = 'Services/Patients.svc/REST/Patient_UpdateWe
var DEACTIVATE_WEIGHT_PRESSURE_RESULT = 'services/Patients.svc/REST/Patient_DeactivateWeightMeasurementStatus'; var DEACTIVATE_WEIGHT_PRESSURE_RESULT = 'services/Patients.svc/REST/Patient_DeactivateWeightMeasurementStatus';
var GET_DOCTOR_RESPONSE = 'Services/Patients.svc/REST/GetDoctorResponse'; var GET_DOCTOR_RESPONSE = 'Services/Patients.svc/REST/GetDoctorResponse';
var UPDATE_READ_STATUS = 'Services/Patients.svc/REST/UpdateReadStatus'; var UPDATE_READ_STATUS = 'Services/Patients.svc/REST/UpdateReadStatus';
var INSERT_CALL_INFO = 'Services/Doctors.svc/REST/InsertCallInfo'; var INSERT_CALL_INFO = 'Services/Doctors.svc/REST/InsertCallInfo';
var INSERT_APPOINTMENT_QUESTION = 'Services/OUTPs.svc/REST/insertAppointmentQuestion';
var RATE_DOCTOR_RESPONSE = 'Services/OUTPs.svc/REST/insertAppointmentQuestionRating';
var GET_PATIENT_ALLERGIES = 'Services/Patients.svc/REST/GetPatientAllergies'; var GET_PATIENT_ALLERGIES = 'Services/Patients.svc/REST/GetPatientAllergies';
@ -600,7 +608,13 @@ var CANCEL_PHARMA_LIVECARE_REQUEST = 'https://vcallapi.hmg.com/api/PharmaLiveCar
var INSERT_FREE_SLOTS_LOGS = 'Services/Doctors.svc/Rest/InsertDoctorFreeSlotsLogs'; var INSERT_FREE_SLOTS_LOGS = 'Services/Doctors.svc/Rest/InsertDoctorFreeSlotsLogs';
var GET_NATIONALITY ='Services/Lists.svc/REST/GetNationality'; var GET_NATIONALITY = 'Services/Lists.svc/REST/GetNationality';
var PAYFORT_TEST_URL = 'https://sbpaymentservices.payfort.com/FortAPI/paymentApi';
var PAYFORT_PROD_URL = 'https://paymentservices.payfort.com/FortAPI/paymentApi';
var CHECK_PATIENT_NPHIES_ELIGIBILITY = 'Services/Doctors.svc/REST/checkPatientInsuranceCompanyValidity';
var CONVERT_PATIENT_TO_CASH = 'Services/Doctors.svc/REST/deActivateInsuranceCompany';
class AppGlobal { class AppGlobal {
static var context; static var context;

@ -326,8 +326,8 @@ const Map localizedValues = {
"nearester": {"en": "Nearest ER", "ar": "أقرب طوارى"}, "nearester": {"en": "Nearest ER", "ar": "أقرب طوارى"},
"locationa": {"en": "Location", "ar": "الموقع"}, "locationa": {"en": "Location", "ar": "الموقع"},
"call_now": {"en": "Call now", "ar": "اتصل الان"}, "call_now": {"en": "Call now", "ar": "اتصل الان"},
"ambulancerequest": {"en": "Ambulance", "ar": "طلب نقل "}, "ambulancerequest": {"en": "Ambulance", "ar": "خدمات النقل "},
"requestA": {"en": "Request", "ar": "اسعاف"}, "requestA": {"en": "Request", "ar": "الاسعافي"},
"NoBookedAppointments": {"en": "No Booked Appointments", "ar": "لا توجد مواعيد محجوزة"}, "NoBookedAppointments": {"en": "No Booked Appointments", "ar": "لا توجد مواعيد محجوزة"},
"NoConfirmedAppointments": {"en": "No Confirmed Appointments", "ar": "لا توجد مواعيد مؤكدة"}, "NoConfirmedAppointments": {"en": "No Confirmed Appointments", "ar": "لا توجد مواعيد مؤكدة"},
"noArrivedAppointments": {"en": "No Arrived Appointments", "ar": "لم يتم حضورها"}, "noArrivedAppointments": {"en": "No Arrived Appointments", "ar": "لم يتم حضورها"},
@ -581,6 +581,7 @@ const Map localizedValues = {
"items": {"en": "item(s)", "ar": "عنصر"}, "items": {"en": "item(s)", "ar": "عنصر"},
"checkOut": {"en": "CHECK OUT", "ar": "الدفع"}, "checkOut": {"en": "CHECK OUT", "ar": "الدفع"},
"sar": {"en": "SAR", "ar": " ر.س "}, "sar": {"en": "SAR", "ar": " ر.س "},
"aed": {"en": "AED", "ar": "درهم"},
"payOnline": {"en": "PAY ONLINE", "ar": "اتمام عملية الدفع "}, "payOnline": {"en": "PAY ONLINE", "ar": "اتمام عملية الدفع "},
"cancelOrder": {"en": "CANCEL ORDER", "ar": "الغاء الطلب "}, "cancelOrder": {"en": "CANCEL ORDER", "ar": "الغاء الطلب "},
"confirmAddress": {"en": "CONFIRM ADDRESS ", "ar": " تأكيد العنوان "}, "confirmAddress": {"en": "CONFIRM ADDRESS ", "ar": " تأكيد العنوان "},
@ -926,7 +927,7 @@ const Map localizedValues = {
"ar": "تعرض هذه الخدمة أقرب فرع من بين جميع فروع مجموعة الحبيب الطبية بناءً على موقعك الحالي." "ar": "تعرض هذه الخدمة أقرب فرع من بين جميع فروع مجموعة الحبيب الطبية بناءً على موقعك الحالي."
}, },
"er": {"en": "ER", "ar": "الطوارىء"}, "er": {"en": "ER", "ar": "الطوارىء"},
"transportation-Service": {"en": "Ambulance Request", "ar": "طلب نقل اسعاف"}, "transportation-Service": {"en": "Ambulance Request", "ar": "خدمات النقل الاسعافي"},
"info-ambulance": { "info-ambulance": {
"en": "Through this service, you can request evacuation by ambulance, whether from home or to home, in addition to a set of other services", "en": "Through this service, you can request evacuation by ambulance, whether from home or to home, in addition to a set of other services",
"ar": "عن طريق هذه الخدمة يمكنك طلب اخلاء بواسطة سيارة اسعاف سواء من المزل او الى المنزل بالاضافة الى مجموعة من الخدمات الاخرى" "ar": "عن طريق هذه الخدمة يمكنك طلب اخلاء بواسطة سيارة اسعاف سواء من المزل او الى المنزل بالاضافة الى مجموعة من الخدمات الاخرى"
@ -1883,4 +1884,19 @@ const Map localizedValues = {
"pharmaLiveCareMakePayment1": {"en": "Make the payment through the mobile app", "ar": "قم بالدفع من خلال تطبيق الهاتف المحمول"}, "pharmaLiveCareMakePayment1": {"en": "Make the payment through the mobile app", "ar": "قم بالدفع من خلال تطبيق الهاتف المحمول"},
"pharmaLiveCareJoinConsultation": {"en": "Join the virtual consultation from booth", "ar": "انضم إلى الاستشارة الافتراضية من الكبينة"}, "pharmaLiveCareJoinConsultation": {"en": "Join the virtual consultation from booth", "ar": "انضم إلى الاستشارة الافتراضية من الكبينة"},
"pharmaLiveCareJoinConsultation1": {"en": "Wait for the doctor in the pharma booth to join you", "ar": "انتظر حتى ينضم إليك الطبيب في كبينة لايف كير الصيدلية"}, "pharmaLiveCareJoinConsultation1": {"en": "Wait for the doctor in the pharma booth to join you", "ar": "انتظر حتى ينضم إليك الطبيب في كبينة لايف كير الصيدلية"},
"emergencyServicesSubtitle": {"en": "Always at your service", "ar": "في خدمتكم دائما"},
"rateDoctorResponse": {"en": "Rate Doctor Response", "ar": "تقييم استجابة الطبيب"},
"comments": {"en": "Comments", "ar": "تعليقات"},
"rateDoctorResponseHeading": {"en": "Please rate the doctor response:", "ar": "يرجى تقييم استجابة الطبيب:"},
"updateInsuranceManuallyDialog": {"en": "Would you like to update your insurance manually?", "ar": "هل ترغب في تحديث التأمين الخاص بك يدويًا؟"},
"viewReport": {"en": "View Report", "ar": "عرض التقرير"},
"sickLeaveAdmittedPatient": {"en": "You cannot activate this sick leave since you're an admitted patient.", "ar": "لا يمكنك تفعيل هذه الإجازة المرضية لأنك مريض مقبل."},
"dischargeDate": {"en": "Discharge Date", "ar": "تاريخ التفريغ"},
"selectAdmissionText": {"en": "Please select one of the admissions from below to view medical reports:", "ar": "يرجى تحديد أحد حالات القبول من الأسفل لعرض التقارير الطبية:"},
"invalidEligibility": {"en": "You cannot make online payment because you are not eligible to use the provided service.", "ar": "لا يمكنك إجراء الدفع عبر الإنترنت لأنك غير مؤهل لاستخدام الخدمة المقدمة."},
"invalidInsurance": {"en": "You cannot make online payment because you do not have a valid insurance.", "ar": "لا يمكنك إجراء الدفع عبر الإنترنت لأنه ليس لديك تأمين صالح."},
"continueCash": {"en": "Continue as cash", "ar": "تواصل نقدا"},
"updateInsurance": {"en": "Update insurance", "ar": "تحديث التأمين"},
"downloadReport": {"en": "Download Report", "ar": "تحميل تقرير المختبر"},
"habibCallCenter": {"en": "Please contact AlHabib call center to update your insurance manually.", "ar": "يرجى الاتصال بمركز اتصال الحبيب لتحديث التأمين الخاص بك يدوياً."},
}; };

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

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

@ -26,6 +26,8 @@ class RequestSendLabReportEmail {
String invoiceNoVP; String invoiceNoVP;
String orderDate; String orderDate;
String orderNo; String orderNo;
bool isDownload;
int doctorID;
RequestSendLabReportEmail( RequestSendLabReportEmail(
{this.versionID, {this.versionID,
@ -53,7 +55,10 @@ class RequestSendLabReportEmail {
this.projectID, this.projectID,
this.invoiceNo, this.invoiceNo,
this.invoiceNoVP, this.invoiceNoVP,
this.orderDate, this.orderNo}); this.orderDate,
this.orderNo,
this.isDownload,
this.doctorID});
RequestSendLabReportEmail.fromJson(Map<String, dynamic> json) { RequestSendLabReportEmail.fromJson(Map<String, dynamic> json) {
versionID = json['VersionID']; versionID = json['VersionID'];
@ -83,6 +88,8 @@ class RequestSendLabReportEmail {
invoiceNoVP = json['InvoiceNo_VP']; invoiceNoVP = json['InvoiceNo_VP'];
orderDate = json['OrderDate']; orderDate = json['OrderDate'];
orderNo = json['OrderNo']; orderNo = json['OrderNo'];
isDownload = json['IsDownload'];
doctorID = json['DoctorID'];
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
@ -114,6 +121,8 @@ class RequestSendLabReportEmail {
data['InvoiceNo_VP'] = this.invoiceNoVP; data['InvoiceNo_VP'] = this.invoiceNoVP;
data['OrderDate'] = this.orderDate; data['OrderDate'] = this.orderDate;
data['OrderNo'] = this.orderNo; data['OrderNo'] = this.orderNo;
data['IsDownload'] = this.isDownload;
data['DoctorID'] = this.doctorID;
return data; return data;
} }
} }

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

@ -15,24 +15,26 @@ class RequestReports {
String tokenID; String tokenID;
int patientTypeID; int patientTypeID;
int patientType; int patientType;
int projectID;
RequestReports( RequestReports(
{this.isReport, {this.isReport,
this.encounterType, this.encounterType,
this.requestType, this.requestType,
this.versionID, this.versionID,
this.channel, this.channel,
this.languageID, this.languageID,
this.iPAdress, this.iPAdress,
this.generalid, this.generalid,
this.patientOutSA, this.patientOutSA,
this.sessionID, this.sessionID,
this.isDentalAllowedBackend, this.isDentalAllowedBackend,
this.deviceTypeID, this.deviceTypeID,
this.patientID, this.patientID,
this.tokenID, this.tokenID,
this.patientTypeID, this.patientTypeID,
this.patientType}); this.patientType,
this.projectID});
RequestReports.fromJson(Map<String, dynamic> json) { RequestReports.fromJson(Map<String, dynamic> json) {
isReport = json['IsReport']; isReport = json['IsReport'];
@ -51,6 +53,7 @@ class RequestReports {
tokenID = json['TokenID']; tokenID = json['TokenID'];
patientTypeID = json['PatientTypeID']; patientTypeID = json['PatientTypeID'];
patientType = json['PatientType']; patientType = json['PatientType'];
projectID = json['ProjectID'];
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
@ -71,6 +74,7 @@ class RequestReports {
data['TokenID'] = this.tokenID; data['TokenID'] = this.tokenID;
data['PatientTypeID'] = this.patientTypeID; data['PatientTypeID'] = this.patientTypeID;
data['PatientType'] = this.patientType; data['PatientType'] = this.patientType;
data['ProjectID'] = this.projectID;
return data; return data;
} }
} }

@ -0,0 +1,64 @@
class AdmissionStatusForSickLeave {
String setupID;
int projectID;
int patientID;
int patientType;
int requestNo;
String requestDate;
int sickLeaveDays;
int appointmentNo;
int admissionNo;
String reportDate;
String placeOfWork;
int status;
dynamic dischargeDate;
AdmissionStatusForSickLeave(
{this.setupID,
this.projectID,
this.patientID,
this.patientType,
this.requestNo,
this.requestDate,
this.sickLeaveDays,
this.appointmentNo,
this.admissionNo,
this.reportDate,
this.placeOfWork,
this.status,
this.dischargeDate});
AdmissionStatusForSickLeave.fromJson(Map<String, dynamic> json) {
setupID = json['SetupID'];
projectID = json['ProjectID'];
patientID = json['PatientID'];
patientType = json['PatientType'];
requestNo = json['RequestNo'];
requestDate = json['RequestDate'];
sickLeaveDays = json['SickLeaveDays'];
appointmentNo = json['AppointmentNo'];
admissionNo = json['AdmissionNo'];
reportDate = json['ReportDate'];
placeOfWork = json['PlaceOfWork'];
status = json['Status'];
dischargeDate = json['DischargeDate'];
}
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['PatientType'] = this.patientType;
data['RequestNo'] = this.requestNo;
data['RequestDate'] = this.requestDate;
data['SickLeaveDays'] = this.sickLeaveDays;
data['AppointmentNo'] = this.appointmentNo;
data['AdmissionNo'] = this.admissionNo;
data['ReportDate'] = this.reportDate;
data['PlaceOfWork'] = this.placeOfWork;
data['Status'] = this.status;
data['DischargeDate'] = this.dischargeDate;
return data;
}
}

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

@ -1,3 +1,5 @@
import 'dart:io';
import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/core/model/ask_doctor/AskDoctorReqTypes.dart'; import 'package:diplomaticquarterapp/core/model/ask_doctor/AskDoctorReqTypes.dart';
import 'package:diplomaticquarterapp/core/model/ask_doctor/DoctorResponse.dart'; import 'package:diplomaticquarterapp/core/model/ask_doctor/DoctorResponse.dart';
@ -42,6 +44,21 @@ class AskDoctorService extends BaseService {
}, body: body); }, body: body);
} }
Future getQuestionTypes() async {
hasError = false;
Map<String, dynamic> body = Map();
body['isDentalAllowedBackend'] = false;
await baseAppClient.post(GET_QUESTION_TYPES, onSuccess: (dynamic response, int statusCode) {
askDoctorReqTypes.clear();
response['QuestionsTypes'].forEach((reqType) {
askDoctorReqTypes.add(AskDoctorReqTypes.fromJson(reqType));
});
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: body);
}
Future getDoctorResponse() async { Future getDoctorResponse() async {
hasError = false; hasError = false;
Map<String, dynamic> body = Map(); Map<String, dynamic> body = Map();
@ -80,21 +97,56 @@ class AskDoctorService extends BaseService {
body['DoctorID'] = doctorList.doctorID; body['DoctorID'] = doctorList.doctorID;
body['PatientMobileNumber'] = user.mobileNumber; body['PatientMobileNumber'] = user.mobileNumber;
body['IsMessageSent'] = false; body['IsMessageSent'] = false;
body['RequestDate'] = DateUtil.yearMonthDay(DateTime.now()); body['RequestDate'] = DateUtil.convertDateToString(DateTime.now());
body['RequestTime'] = DateUtil.time(DateTime.now()); body['RequestTime'] = DateUtil.convertDateToString(DateTime.now());
body['Remarks'] = remark; body['Remarks'] = remark;
body['Status'] = 2; // 4 for testing only.."cancelled status insert" else should be changed to 1 in live version body['Status'] = 2; // 4 for testing only.."cancelled status insert" else should be changed to 1 in live version
body['CreatedBy'] = 102; body['CreatedBy'] = 102;
body['CreatedOn'] = DateUtil.yearMonthDay(DateTime.now()); body['CreatedOn'] = DateUtil.convertDateToString(DateTime.now());
body['EditedBy'] = 102; body['EditedBy'] = 102;
body['EditedOn'] = DateUtil.yearMonthDay(DateTime.now()); body['EditedOn'] = DateUtil.convertDateToString(DateTime.now());
body['isDentalAllowedBackend'] = false; body['isDentalAllowedBackend'] = false;
body['AppointmentNo'] = doctorList.appointmentNo;
body['ClinicID'] = doctorList.clinicID;
body['QuestionType'] = num.parse(requestType); body['QuestionType'] = num.parse(requestType);
body['RequestType'] = num.parse(requestType); body['RequestType'] = num.parse(requestType);
body['RequestTypeID'] = num.parse(requestType); body['RequestTypeID'] = num.parse(requestType);
await baseAppClient.post(INSERT_CALL_INFO, onSuccess: (dynamic response, int statusCode) {}, onFailure: (String error, int statusCode) { await baseAppClient.post(INSERT_CALL_INFO, onSuccess: (dynamic response, int statusCode) {}, onFailure: (String error, int statusCode) {
hasError = true; hasError = true;
super.error = error; super.error = error;
}, body: body); }, body: body);
} }
Future rateDoctorResponse({int transactionNo, int questionType, int rate, String notes, String mobileNo, String idNo, String patientName, int projectID, String language}) async {
hasError = false;
dynamic localRes;
Map<String, dynamic> body = Map();
body['MobileNo'] = mobileNo;
body['IdentificationNo'] = idNo;
body['PatientName'] = patientName;
body['IsUserLoggedIn'] = true;
body['ProjectID'] = projectID;
body['UILanguage'] = language;
body['BrowserInfo'] = Platform.localHostname;
body['COCTypeName'] = 3;
body['FormTypeID'] = 3;
body['DeviceInfo'] = Platform.localHostname;
body['Resolution'] = "400x847";
body['AppVersion'] = VERSION_ID;
body['ForDemo'] = false;
body['isVidaPlus'] = false;
body['TransactionNo'] = transactionNo;
body['QuestionType'] = questionType;
body['Rate'] = rate;
body['Notes'] = notes;
await baseAppClient.post(RATE_DOCTOR_RESPONSE, onSuccess: (dynamic response, int statusCode) {
localRes = response;
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: body);
return Future.value(localRes);
}
} }

@ -11,6 +11,8 @@ import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.da
class LabsService extends BaseService { class LabsService extends BaseService {
List<PatientLabOrders> patientLabOrdersList = List(); List<PatientLabOrders> patientLabOrdersList = List();
String labReportPDF = "";
Future getPatientLabOrdersList() async { Future getPatientLabOrdersList() async {
hasError = false; hasError = false;
Map<String, dynamic> body = Map(); Map<String, dynamic> body = Map();
@ -157,6 +159,24 @@ class LabsService extends BaseService {
return Future.value(localRes); return Future.value(localRes);
} }
Future getSickLeaveStatusByAdmissionNo(int projectID, int admissionNo) async {
hasError = false;
Map<String, dynamic> body = Map();
body['AdmissionNo'] = admissionNo;
body['ProjectID'] = projectID;
dynamic localRes;
await baseAppClient.post(GET_SICKLEAVE_STATUS_ADMISSION_NO, onSuccess: (dynamic response, int statusCode) {
localRes = response;
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: body);
return Future.value(localRes);
}
Future getPatientLabOrdersResults({PatientLabOrders patientLabOrder, String procedure}) async { Future getPatientLabOrdersResults({PatientLabOrders patientLabOrder, String procedure}) async {
hasError = false; hasError = false;
Map<String, dynamic> body = Map(); Map<String, dynamic> body = Map();
@ -181,7 +201,7 @@ class LabsService extends BaseService {
RequestSendLabReportEmail _requestSendLabReportEmail = RequestSendLabReportEmail(); RequestSendLabReportEmail _requestSendLabReportEmail = RequestSendLabReportEmail();
Future sendLabReportEmail({PatientLabOrders patientLabOrder, AuthenticatedUser userObj, bool isVidaPlus}) async { Future sendLabReportEmail({PatientLabOrders patientLabOrder, AuthenticatedUser userObj, bool isVidaPlus, bool isDownload = false}) async {
_requestSendLabReportEmail.projectID = patientLabOrder.projectID; _requestSendLabReportEmail.projectID = patientLabOrder.projectID;
_requestSendLabReportEmail.invoiceNo = isVidaPlus ? "0" : patientLabOrder.invoiceNo; _requestSendLabReportEmail.invoiceNo = isVidaPlus ? "0" : patientLabOrder.invoiceNo;
_requestSendLabReportEmail.invoiceNoVP = isVidaPlus ? patientLabOrder.invoiceNo : "0"; _requestSendLabReportEmail.invoiceNoVP = isVidaPlus ? patientLabOrder.invoiceNo : "0";
@ -196,8 +216,15 @@ class LabsService extends BaseService {
_requestSendLabReportEmail.projectName = patientLabOrder.projectName; _requestSendLabReportEmail.projectName = patientLabOrder.projectName;
_requestSendLabReportEmail.setupID = patientLabOrder.setupID; _requestSendLabReportEmail.setupID = patientLabOrder.setupID;
_requestSendLabReportEmail.orderNo = patientLabOrder.orderNo; _requestSendLabReportEmail.orderNo = patientLabOrder.orderNo;
_requestSendLabReportEmail.orderNo = patientLabOrder.orderNo;
_requestSendLabReportEmail.isDownload = isDownload;
_requestSendLabReportEmail.doctorID = patientLabOrder.doctorID;
await baseAppClient.post(SEND_LAB_RESULT_EMAIL, onSuccess: (dynamic response, int statusCode) {}, onFailure: (String error, int statusCode) { await baseAppClient.post(SEND_LAB_RESULT_EMAIL, onSuccess: (dynamic response, int statusCode) {
if (isDownload) {
labReportPDF = response['LabReportsPDFContent'];
}
}, onFailure: (String error, int statusCode) {
hasError = true; hasError = true;
super.error = error; super.error = error;
}, body: _requestSendLabReportEmail.toJson()); }, body: _requestSendLabReportEmail.toJson());

@ -1,24 +1,23 @@
import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/core/model/reports/Reports.dart'; import 'package:diplomaticquarterapp/core/model/reports/Reports.dart';
import 'package:diplomaticquarterapp/core/model/reports/admission_for_medical_report.dart';
import 'package:diplomaticquarterapp/core/model/reports/request_reports.dart'; import 'package:diplomaticquarterapp/core/model/reports/request_reports.dart';
import 'package:diplomaticquarterapp/core/service/base_service.dart'; import 'package:diplomaticquarterapp/core/service/base_service.dart';
import 'package:diplomaticquarterapp/pages/feedback/appointment_history.dart'; import 'package:diplomaticquarterapp/pages/feedback/appointment_history.dart';
class ReportsService extends BaseService { class ReportsService extends BaseService {
List<Reports> reportsList = List(); List<Reports> reportsList = List();
List<Reports> inpatientReportsList = List();
List<AppointmentHistory> appointHistoryList = List(); List<AppointmentHistory> appointHistoryList = List();
List<AdmissionMedicalReport> admissionsMedicalReport = List();
String userAgreementContent = ""; String userAgreementContent = "";
RequestReports _requestReports = RequestReports( RequestReports _requestReports = RequestReports(isReport: true, encounterType: 1, requestType: 1, patientOutSA: 0, projectID: 0);
isReport: true,
encounterType: 1,
requestType: 1,
patientOutSA: 0,
);
Future getReports() async { Future getReports() async {
hasError = false; hasError = false;
await baseAppClient.post(REPORTS, await baseAppClient.post(REPORTS, onSuccess: (dynamic response, int statusCode) {
onSuccess: (dynamic response, int statusCode) {
reportsList.clear(); reportsList.clear();
response['GetPatientMedicalStatus'].forEach((reports) { response['GetPatientMedicalStatus'].forEach((reports) {
reportsList.add(Reports.fromJson(reports)); reportsList.add(Reports.fromJson(reports));
@ -29,12 +28,41 @@ class ReportsService extends BaseService {
}, body: _requestReports.toJson()); }, body: _requestReports.toJson());
} }
Future getInPatientReports() async {
RequestReports _requestReportsInpatient = RequestReports(isReport: true, encounterType: 2, requestType: 1, patientOutSA: 0, projectID: 0);
hasError = false;
await baseAppClient.post(REPORTS, onSuccess: (dynamic response, int statusCode) {
inpatientReportsList.clear();
response['GetPatientMedicalStatus'].forEach((reports) {
inpatientReportsList.add(Reports.fromJson(reports));
});
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: _requestReportsInpatient.toJson());
}
Future getInpatientAdmissionsList() async {
Map<String, dynamic> body = new Map<String, dynamic>();
body['IsForMedicalReport'] = true;
hasError = false;
await baseAppClient.post(GET_INPATIENT_ADMISSIONS, onSuccess: (dynamic response, int statusCode) {
admissionsMedicalReport.clear();
print(response['AdmissionsForMedicalReport']);
response['AdmissionsForMedicalReport'].forEach((reports) {
admissionsMedicalReport.add(AdmissionMedicalReport.fromJson(reports));
});
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: body);
}
Future getPatentAppointmentHistory() async { Future getPatentAppointmentHistory() async {
hasError = false; hasError = false;
Map<String, dynamic> body = new Map<String, dynamic>(); Map<String, dynamic> body = new Map<String, dynamic>();
body['IsForMedicalReport'] = true; body['IsForMedicalReport'] = true;
await baseAppClient.post(GET_PATIENT_AppointmentHistory, await baseAppClient.post(GET_PATIENT_AppointmentHistory, onSuccess: (dynamic response, int statusCode) {
onSuccess: (dynamic response, int statusCode) {
appointHistoryList = []; appointHistoryList = [];
response['AppoimentAllHistoryResultList'].forEach((appoint) { response['AppoimentAllHistoryResultList'].forEach((appoint) {
appointHistoryList.add(AppointmentHistory.fromJson(appoint)); appointHistoryList.add(AppointmentHistory.fromJson(appoint));
@ -47,8 +75,7 @@ class ReportsService extends BaseService {
Future getUserTermsAndConditions() async { Future getUserTermsAndConditions() async {
hasError = false; hasError = false;
await baseAppClient.post(GET_USER_TERMS, await baseAppClient.post(GET_USER_TERMS, onSuccess: (dynamic response, int statusCode) {
onSuccess: (dynamic response, int statusCode) {
userAgreementContent = response['UserAgreementContent']; userAgreementContent = response['UserAgreementContent'];
}, onFailure: (String error, int statusCode) { }, onFailure: (String error, int statusCode) {
hasError = true; hasError = true;
@ -60,9 +87,7 @@ class ReportsService extends BaseService {
Map<String, dynamic> body = Map<String, dynamic>(); Map<String, dynamic> body = Map<String, dynamic>();
body['RSummaryReport'] = isSummary; body['RSummaryReport'] = isSummary;
hasError = false; hasError = false;
await baseAppClient.post(UPDATE_HEALTH_TERMS, await baseAppClient.post(UPDATE_HEALTH_TERMS, onSuccess: (dynamic response, int statusCode) {}, onFailure: (String error, int statusCode) {
onSuccess: (dynamic response, int statusCode) {},
onFailure: (String error, int statusCode) {
hasError = true; hasError = true;
super.error = error; super.error = error;
}, body: body); }, body: body);
@ -73,16 +98,13 @@ class ReportsService extends BaseService {
body['EmailAddress'] = email; body['EmailAddress'] = email;
body['isDentalAllowedBackend'] = false; body['isDentalAllowedBackend'] = false;
hasError = false; hasError = false;
await baseAppClient.post(UPDATE_PATENT_EMAIL, await baseAppClient.post(UPDATE_PATENT_EMAIL, onSuccess: (dynamic response, int statusCode) {}, onFailure: (String error, int statusCode) {
onSuccess: (dynamic response, int statusCode) {}, hasError = true;
onFailure: (String error, int statusCode) { super.error = error;
hasError = true; }, body: body);
super.error = error;
}, body: body);
} }
Future insertRequestForMedicalReport( Future insertRequestForMedicalReport(AppointmentHistory appointmentHistory) async {
AppointmentHistory appointmentHistory) async {
Map<String, dynamic> body = new Map<String, dynamic>(); Map<String, dynamic> body = new Map<String, dynamic>();
body['ClinicID'] = appointmentHistory.clinicID; body['ClinicID'] = appointmentHistory.clinicID;
body['DoctorID'] = appointmentHistory.doctorID; body['DoctorID'] = appointmentHistory.doctorID;
@ -98,23 +120,65 @@ class ReportsService extends BaseService {
body['Status'] = 1; body['Status'] = 1;
body['CreatedBy'] = 102; body['CreatedBy'] = 102;
hasError = false; hasError = false;
await baseAppClient.post(INSERT_REQUEST_FOR_MEDICAL_REPORT, await baseAppClient.post(INSERT_REQUEST_FOR_MEDICAL_REPORT, onSuccess: (dynamic response, int statusCode) {}, onFailure: (String error, int statusCode) {
onSuccess: (dynamic response, int statusCode) {},
onFailure: (String error, int statusCode) {
hasError = true; hasError = true;
super.error = error; super.error = error;
}, body: body); }, body: body);
} }
Future sendEmailForMedicalReport( Future insertRequestForInPatientMedicalReport(int clinicID, int doctorID, String setupID, int admissionNo, int projectID) async {
String projectName, Map<String, dynamic> body = new Map<String, dynamic>();
String clinicName, body['ClinicID'] = clinicID;
String doctorName, body['DoctorID'] = doctorID;
String requestDate, body['SetupID'] = setupID;
String invoiceNo, body['EncounterNo'] = admissionNo;
int projectID, body['EncounterType'] = 2; // appointmentHistory.appointmentType;
String stamp, body['IsActive'] = true;
String setupID) async { body['ProjectID'] = projectID;
body['Remarks'] = "";
body['ProcedureId'] = "";
body['RequestType'] = 1;
body['Source'] = 2;
body['Status'] = 1;
body['CreatedBy'] = 102;
hasError = false;
await baseAppClient.post(INSERT_REQUEST_FOR_MEDICAL_REPORT, onSuccess: (dynamic response, int statusCode) {}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: body);
}
Future sendEmailForMedicalReport(String projectName, String clinicName, String doctorName, String requestDate, String invoiceNo, int projectID, String stamp, String setupID) async {
Map<String, dynamic> body = new Map<String, dynamic>();
body['SetupID'] = setupID;
body['PrintDate'] = requestDate;
body['ProcedureID'] = "05005009";
body['Reporttype'] = "MEDICAL REPORT";
body['stamp'] = stamp;
body['To'] = user.emailAddress;
body['DateofBirth'] = user.dateofBirth;
body['PatientIditificationNum'] = user.patientIdentificationNo;
body['PatientMobileNumber'] = user.mobileNumber;
body['PatientName'] = user.firstName + " " + user.lastName;
body['ProjectName'] = projectName;
body['ClinicName'] = clinicName;
body['ProjectID'] = projectID;
body['InvoiceNo'] = invoiceNo;
body['PrintedByName'] = user.firstName + " " + user.lastName;
dynamic response;
hasError = false;
await baseAppClient.post(SEND_MEDICAL_REPORT_EMAIL, onSuccess: (dynamic res, int statusCode) {
response = res;
}, onFailure: (String error, int statusCode) {
hasError = true;
super.error = error;
}, body: body);
return response;
}
Future getMedicalReportPDF(String projectName, String clinicName, String doctorName, String requestDate, String invoiceNo, int projectID, String stamp, String setupID) async {
Map<String, dynamic> body = new Map<String, dynamic>(); Map<String, dynamic> body = new Map<String, dynamic>();
body['SetupID'] = setupID; body['SetupID'] = setupID;
body['PrintDate'] = requestDate; body['PrintDate'] = requestDate;
@ -135,11 +199,9 @@ class ReportsService extends BaseService {
dynamic response; dynamic response;
hasError = false; hasError = false;
await baseAppClient.post(SEND_MEDICAL_REPORT_EMAIL, await baseAppClient.post(GET_MEDICAL_REPORT_PDF, onSuccess: (dynamic res, int statusCode) {
onSuccess: (dynamic res, int statusCode) { response = res;
response = res; }, onFailure: (String error, int statusCode) {
},
onFailure: (String error, int statusCode) {
hasError = true; hasError = true;
super.error = error; super.error = error;
}, body: body); }, body: body);

@ -54,6 +54,17 @@ class AskDoctorViewModel extends BaseViewModel {
setState(ViewState.Idle); setState(ViewState.Idle);
} }
Future getQuestionTypes() async {
setState(ViewState.Busy);
await _askDoctorService.getQuestionTypes();
if (_askDoctorService.hasError) {
error = _askDoctorService.error;
setState(ViewState.ErrorLocal);
AppToast.showErrorToast(message: error);
} else
setState(ViewState.Idle);
}
Future getCallInfoHoursResult({int projectId, int doctorId}) async { Future getCallInfoHoursResult({int projectId, int doctorId}) async {
setState(ViewState.Busy); setState(ViewState.Busy);
await _askDoctorService.getCallInfoHoursResult(projectId: projectId, doctorId: doctorId); await _askDoctorService.getCallInfoHoursResult(projectId: projectId, doctorId: doctorId);

@ -20,6 +20,8 @@ class LabsViewModel extends BaseViewModel {
List<LabOrderResult> get labOrdersResultsList => _labsService.labOrdersResultsList; List<LabOrderResult> get labOrdersResultsList => _labsService.labOrdersResultsList;
List<TimeSeriesSales2> timeSeries = []; List<TimeSeriesSales2> timeSeries = [];
String get labReportPDF => _labsService.labReportPDF;
List<PatientLabOrdersList> _patientLabOrdersListClinic = List(); List<PatientLabOrdersList> _patientLabOrdersListClinic = List();
List<PatientLabOrdersList> _patientLabOrdersListHospital = List(); List<PatientLabOrdersList> _patientLabOrdersListHospital = List();
@ -46,7 +48,7 @@ class LabsViewModel extends BaseViewModel {
List<PatientLabOrdersList> patientLabOrdersHospital = _patientLabOrdersListHospital List<PatientLabOrdersList> patientLabOrdersHospital = _patientLabOrdersListHospital
.where( .where(
(elementClinic) => elementClinic.filterName == element.projectName, (elementClinic) => elementClinic.filterName == element.projectName,
) )
.toList(); .toList();
if (patientLabOrdersHospital.length != 0) { if (patientLabOrdersHospital.length != 0) {
@ -74,7 +76,12 @@ class LabsViewModel extends BaseViewModel {
getLaboratoryResult({String projectID, int clinicID, String invoiceNo, String orderNo, String setupID, bool isVidaPlus}) async { getLaboratoryResult({String projectID, int clinicID, String invoiceNo, String orderNo, String setupID, bool isVidaPlus}) async {
setState(ViewState.Busy); setState(ViewState.Busy);
await _labsService.getLaboratoryResult(invoiceNo: invoiceNo, orderNo: orderNo, projectID: projectID, clinicID: clinicID, setupID: setupID, isVidaPlus: isVidaPlus); await _labsService.getLaboratoryResult(invoiceNo: invoiceNo,
orderNo: orderNo,
projectID: projectID,
clinicID: clinicID,
setupID: setupID,
isVidaPlus: isVidaPlus);
if (_labsService.hasError) { if (_labsService.hasError) {
error = _labsService.error; error = _labsService.error;
setState(ViewState.Error); setState(ViewState.Error);
@ -135,11 +142,14 @@ class LabsViewModel extends BaseViewModel {
} }
} }
sendLabReportEmail({PatientLabOrders patientLabOrder, String mes, AuthenticatedUser userObj, bool isVidaPlus}) async { sendLabReportEmail({PatientLabOrders patientLabOrder, String mes, AuthenticatedUser userObj, bool isVidaPlus, bool isDownload = false}) async {
await _labsService.sendLabReportEmail(patientLabOrder: patientLabOrder, userObj: userObj, isVidaPlus: isVidaPlus); await _labsService.sendLabReportEmail(patientLabOrder: patientLabOrder, userObj: userObj, isVidaPlus: isVidaPlus, isDownload: isDownload);
if (_labsService.hasError) { if (_labsService.hasError) {
error = _labsService.error; error = _labsService.error;
} else } else {
AppToast.showSuccessToast(message: mes); if (isDownload) {} else {
AppToast.showSuccessToast(message: mes);
}
}
} }
} }

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

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

@ -1,6 +1,19 @@
import 'dart:convert';
import 'package:crypto/crypto.dart';
extension CapExtension on String { extension CapExtension on String {
String get toCamelCase => "${this[0].toUpperCase()}${this.substring(1)}"; String get toCamelCase => "${this[0].toUpperCase()}${this.substring(1)}";
String get inCaps => '${this[0].toUpperCase()}${this.substring(1)}'; String get inCaps => '${this[0].toUpperCase()}${this.substring(1)}';
String get allInCaps => this.toUpperCase(); String get allInCaps => this.toUpperCase();
String get capitalizeFirstofEach => this.trim().length > 0 ? this.trim().toLowerCase().split(" ").map((str) => str.inCaps).join(" ") : "";
String get capitalizeFirstofEach => this.trim().length > 0 ? this.trim().toLowerCase().split(" ").map((str) => str.isNotEmpty ? str.inCaps : str).join(" ") : "";
}
extension HashSha on String {
String get toSha256 {
var bytes = utf8.encode(this);
return sha256.convert(bytes).toString();
}
} }

@ -1,5 +1,6 @@
class DoctorList { class DoctorList {
num clinicID; num clinicID;
dynamic appointmentNo;
String clinicName; String clinicName;
String doctorTitle; String doctorTitle;
num iD; num iD;
@ -45,6 +46,7 @@ class DoctorList {
DoctorList( DoctorList(
{this.clinicID, {this.clinicID,
this.appointmentNo,
this.clinicName, this.clinicName,
this.doctorTitle, this.doctorTitle,
this.iD, this.iD,
@ -90,6 +92,7 @@ class DoctorList {
DoctorList.fromJson(Map<String, dynamic> json) { DoctorList.fromJson(Map<String, dynamic> json) {
clinicID = json['ClinicID']; clinicID = json['ClinicID'];
appointmentNo = json['AppointmentNo'];
clinicName = json['ClinicName']; clinicName = json['ClinicName'];
doctorTitle = json['DoctorTitle']; doctorTitle = json['DoctorTitle'];
iD = json['ID']; iD = json['ID'];
@ -138,6 +141,7 @@ class DoctorList {
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>(); final Map<String, dynamic> data = new Map<String, dynamic>();
data['ClinicID'] = this.clinicID; data['ClinicID'] = this.clinicID;
data['AppointmentNo'] = this.appointmentNo;
data['ClinicName'] = this.clinicName; data['ClinicName'] = this.clinicName;
data['DoctorTitle'] = this.doctorTitle; data['DoctorTitle'] = this.doctorTitle;
data['ID'] = this.iD; data['ID'] = this.iD;

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

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

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

@ -52,6 +52,7 @@ class _SearchResultsState extends State<SearchResults> {
? widget.patientDoctorAppointmentListHospital[index].filterName + " - " + widget.patientDoctorAppointmentListHospital[index].distanceInKMs + " " + TranslationBase.of(context).km ? widget.patientDoctorAppointmentListHospital[index].filterName + " - " + widget.patientDoctorAppointmentListHospital[index].distanceInKMs + " " + TranslationBase.of(context).km
: widget.patientDoctorAppointmentListHospital[index].filterName, : widget.patientDoctorAppointmentListHospital[index].filterName,
isTitleSingleLine: false, isTitleSingleLine: false,
isExpand: widget.patientDoctorAppointmentListHospital.length == 1 ? true : false,
bodyWidget: ListView.separated( bodyWidget: ListView.separated(
shrinkWrap: true, shrinkWrap: true,
physics: NeverScrollableScrollPhysics(), physics: NeverScrollableScrollPhysics(),

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

@ -240,7 +240,7 @@ class _SearchByClinicState extends State<SearchByClinic> {
dropdownValue = dropdownValue =
clincs.clinicID.toString() + "-" + clincs.isLiveCareClinicAndOnline.toString() + "-" + clincs.liveCareClinicID.toString() + "-" + clincs.liveCareServiceID.toString(); clincs.clinicID.toString() + "-" + clincs.isLiveCareClinicAndOnline.toString() + "-" + clincs.liveCareClinicID.toString() + "-" + clincs.liveCareServiceID.toString();
if (dropdownValue == "253-false-0-0") { if (dropdownValue == "253-false-0-0") {
Navigator.push(context, FadePage(page: LaserClinic())); // Navigator.push(context, FadePage(page: LaserClinic()));
} else if (!isDentalSelectedAndSupported()) { } else if (!isDentalSelectedAndSupported()) {
projectDropdownValue = ""; projectDropdownValue = "";
if (!nearestAppo) getDoctorsList(context); if (!nearestAppo) getDoctorsList(context);
@ -332,7 +332,11 @@ class _SearchByClinicState extends State<SearchByClinic> {
setState(() { setState(() {
selectedHospital = newValue; selectedHospital = newValue;
projectDropdownValue = newValue.mainProjectID.toString(); projectDropdownValue = newValue.mainProjectID.toString();
getDoctorsList(context); if (dropdownValue.split("-")[0] == "253") {
Navigator.push(context, FadePage(page: LaserClinic(selectedHospital: selectedHospital)));
} else {
getDoctorsList(context);
}
}); });
}, },
), ),
@ -457,7 +461,7 @@ class _SearchByClinicState extends State<SearchByClinic> {
bool isDentalSelectedAndSupported() { bool isDentalSelectedAndSupported() {
if (dropdownValue != null) if (dropdownValue != null)
return dropdownValue != "" && (dropdownValue.split("-")[0] == "17") && isMobileAppDentalAllow; return dropdownValue != "" && (dropdownValue.split("-")[0] == "17" || dropdownValue.split("-")[0] == "253") && isMobileAppDentalAllow;
else else
return false; return false;
} }

@ -446,11 +446,10 @@ class _MyFamily extends State<MyFamily> with TickerProviderStateMixin {
this.familyFileProvider.deativateActivateMemberFile(request).then((value) => refreshFamily(context)); this.familyFileProvider.deativateActivateMemberFile(request).then((value) => refreshFamily(context));
} }
refreshFamily(context) { refreshFamily(context) async {
setState(() {
sharedPref.remove(FAMILY_FILE); await sharedPref.remove(FAMILY_FILE);
checkUserData(); await checkUserData();
});
} }
switchUser(user, context) { switchUser(user, context) {
@ -525,17 +524,23 @@ class _MyFamily extends State<MyFamily> with TickerProviderStateMixin {
Map<String, dynamic> request = {}; Map<String, dynamic> request = {};
request["ID"] = ID; request["ID"] = ID;
request["Status"] = status; request["Status"] = status;
this.familyFileProvider.acceptRejectFamily(request).then((value) => {GifLoaderDialogUtils.hideDialog(context), refreshFamily(context)}); this.familyFileProvider.acceptRejectFamily(request).then((value) async{
await refreshFamily(context);
GifLoaderDialogUtils.hideDialog(context);
});
} }
checkUserData() async { checkUserData() async {
if (await this.sharedPref.getObject(USER_PROFILE) != null) { if (await this.sharedPref.getObject(USER_PROFILE) != null) {
var data = AuthenticatedUser.fromJson(await this.sharedPref.getObject(USER_PROFILE)); var data = AuthenticatedUser.fromJson(await this.sharedPref.getObject(USER_PROFILE));
var data2 = AuthenticatedUser.fromJson(await this.sharedPref.getObject(MAIN_USER)); // var data2 = AuthenticatedUser.fromJson(await this.sharedPref.getObject(MAIN_USER));
await getFamilyFiles(); await getFamilyFiles();
setState(() {
this.user = data; this.user = data;
}); setState(() {
});
} }
} }
@ -552,16 +557,20 @@ class _MyFamily extends State<MyFamily> with TickerProviderStateMixin {
GifLoaderDialogUtils.showMyDialog(context); GifLoaderDialogUtils.showMyDialog(context);
try { try {
if (familySharedRecords == null) { if (familySharedRecords == null) {
familySharedRecords = await familyFileProvider.getSharedRecordByStatus(); familySharedRecords = await familyFileProvider.getSharedRecordByStatus();
} }
sentRecordsList =[];
familySharedRecords.getAllSharedRecordsByStatusList.forEach((element) { familySharedRecords.getAllSharedRecordsByStatusList.forEach((element) {
if (element.status == 3) { if (element.status == 3) {
familySharedRecordsList.add(element); familySharedRecordsList.add(element);
} }
sentRecordsList.add(element); sentRecordsList.add(element);
}); });
approvedRecordsList =[];
pendingRecordsList =[];
GetAllSharedRecordsByStatusResponse pendingAndApprovedRecords = await getUserViewRequest(); GetAllSharedRecordsByStatusResponse pendingAndApprovedRecords = await getUserViewRequest();
pendingAndApprovedRecords.getAllSharedRecordsByStatusList.forEach((element) { pendingAndApprovedRecords.getAllSharedRecordsByStatusList.forEach((element) {
print(element.toJson()); print(element.toJson());
if (element.status == 2) { if (element.status == 2) {
@ -571,6 +580,7 @@ class _MyFamily extends State<MyFamily> with TickerProviderStateMixin {
} }
}); });
} catch (ex) { } catch (ex) {
familySharedRecords = GetAllSharedRecordsByStatusResponse(getAllSharedRecordsByStatusList: []); familySharedRecords = GetAllSharedRecordsByStatusResponse(getAllSharedRecordsByStatusList: []);
} }
GifLoaderDialogUtils.hideDialog(context); GifLoaderDialogUtils.hideDialog(context);

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

@ -17,6 +17,8 @@ import 'package:diplomaticquarterapp/pages/BookAppointment/SearchResults.dart';
import 'package:diplomaticquarterapp/pages/MyAppointments/AppointmentDetails.dart'; import 'package:diplomaticquarterapp/pages/MyAppointments/AppointmentDetails.dart';
import 'package:diplomaticquarterapp/pages/ToDoList/payment_method_select.dart'; import 'package:diplomaticquarterapp/pages/ToDoList/payment_method_select.dart';
import 'package:diplomaticquarterapp/pages/ToDoList/widgets/paymentDialog.dart'; import 'package:diplomaticquarterapp/pages/ToDoList/widgets/paymentDialog.dart';
import 'package:diplomaticquarterapp/pages/insurance/insurance_update_screen.dart';
import 'package:diplomaticquarterapp/pages/landing/landing_page.dart';
import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart'; import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart';
import 'package:diplomaticquarterapp/theme/colors.dart'; import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
@ -28,6 +30,7 @@ import 'package:diplomaticquarterapp/uitl/utils.dart';
import 'package:diplomaticquarterapp/uitl/utils_new.dart'; import 'package:diplomaticquarterapp/uitl/utils_new.dart';
import 'package:diplomaticquarterapp/widgets/avatar/large_avatar.dart'; import 'package:diplomaticquarterapp/widgets/avatar/large_avatar.dart';
import 'package:diplomaticquarterapp/widgets/data_display/medical/doctor_card.dart'; import 'package:diplomaticquarterapp/widgets/data_display/medical/doctor_card.dart';
import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart';
import 'package:diplomaticquarterapp/widgets/in_app_browser/InAppBrowser.dart'; import 'package:diplomaticquarterapp/widgets/in_app_browser/InAppBrowser.dart';
import 'package:diplomaticquarterapp/widgets/my_rich_text.dart'; import 'package:diplomaticquarterapp/widgets/my_rich_text.dart';
import 'package:diplomaticquarterapp/widgets/others/app_expandable_notifier.dart'; import 'package:diplomaticquarterapp/widgets/others/app_expandable_notifier.dart';
@ -76,6 +79,10 @@ class _ToDoState extends State<ToDo> with SingleTickerProviderStateMixin {
bool dataLoaded = false; bool dataLoaded = false;
bool isInsured = false;
bool isEligible = false;
bool isCash = false;
@override @override
void initState() { void initState() {
widget.patientShareResponse = new PatientShareResponse(); widget.patientShareResponse = new PatientShareResponse();
@ -541,6 +548,7 @@ class _ToDoState extends State<ToDo> with SingleTickerProviderStateMixin {
break; break;
case 20: case 20:
getPatientShare(context, appo); getPatientShare(context, appo);
// checkPatientNphiesEligibility(context, appo);
break; break;
case 30: case 30:
getAppoQR(context, appo); getAppoQR(context, appo);
@ -837,7 +845,55 @@ class _ToDoState extends State<ToDo> with SingleTickerProviderStateMixin {
// getAncillaryOrders(); // getAncillaryOrders();
} }
checkPatientNphiesEligibility(context, AppoitmentAllHistoryResultList appo) {
DoctorsListService service = new DoctorsListService();
GifLoaderDialogUtils.showMyDialog(context);
service.checkPatientNphiesEligibility(appo.projectID).then((res) {
GifLoaderDialogUtils.hideDialog(context);
if (res["isNphiesMatchedWithVida"]) {
getPatientShare(context, appo);
// getToDoCount();
} else {
ConfirmDialog dialog = new ConfirmDialog(
isDissmissable: false,
context: context,
confirmMessage: res['ErrorEndUserMessage'],
okText: "Update insurance",
cancelText: "Continue as cash",
okFunction: () => {openUpdateInsurance()},
cancelFunction: () => {continueAsCash(appo)});
dialog.showAlertDialog(context);
}
}).catchError((err) {
GifLoaderDialogUtils.hideDialog(context);
print(err);
});
}
void openUpdateInsurance() {
Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (context) => LandingPage()), (Route<dynamic> r) => false);
Navigator.push(context, FadePage(page: InsuranceUpdate()));
}
void continueAsCash(AppoitmentAllHistoryResultList appo) {
DoctorsListService service = new DoctorsListService();
GifLoaderDialogUtils.showMyDialog(context);
service.convertPatientToCash(appo.projectID).then((res) {
GifLoaderDialogUtils.hideDialog(context);
if (res["MessageStatus"] == 1) {
getPatientShare(context, appo);
// getToDoCount();
} else {
AppToast.showErrorToast(message: res["ErrorEndUserMessage"]);
}
}).catchError((err) {
GifLoaderDialogUtils.hideDialog(context);
print(err);
});
}
getPatientShare(context, AppoitmentAllHistoryResultList appo) { getPatientShare(context, AppoitmentAllHistoryResultList appo) {
String errorMsg = "";
DoctorsListService service = new DoctorsListService(); DoctorsListService service = new DoctorsListService();
if (appo.isLiveCareAppointment) { if (appo.isLiveCareAppointment) {
getLiveCareAppointmentPatientShare(context, service, appo); getLiveCareAppointmentPatientShare(context, service, appo);
@ -845,8 +901,33 @@ class _ToDoState extends State<ToDo> with SingleTickerProviderStateMixin {
GifLoaderDialogUtils.showMyDialog(context); GifLoaderDialogUtils.showMyDialog(context);
service.getPatientShare(appo.appointmentNo.toString(), appo.clinicID, appo.projectID, context).then((res) { service.getPatientShare(appo.appointmentNo.toString(), appo.clinicID, appo.projectID, context).then((res) {
GifLoaderDialogUtils.hideDialog(context); GifLoaderDialogUtils.hideDialog(context);
widget.patientShareResponse = new PatientShareResponse.fromJson(res); widget.patientShareResponse = new PatientShareResponse.fromJson(res['OnlineCheckInAppointments'][0]);
openPaymentDialog(appo, widget.patientShareResponse); isInsured = res["IsInsured"];
isEligible = res["IsEligible"];
isCash = res["IsCash"];
if (isCash) {
openPaymentDialog(appo, widget.patientShareResponse);
} else {
if (isInsured && isEligible) {
openPaymentDialog(appo, widget.patientShareResponse);
} else {
if (isInsured && !isEligible) {
errorMsg = TranslationBase.of(context).invalidEligibility;
} else {
errorMsg = TranslationBase.of(context).invalidInsurance;
}
ConfirmDialog dialog = new ConfirmDialog(
isDissmissable: false,
context: context,
confirmMessage: errorMsg,
okText: TranslationBase.of(context).updateInsuranceText,
cancelText: TranslationBase.of(context).continueCash,
okFunction: () => {openUpdateInsurance()},
cancelFunction: () => {continueAsCash(appo)});
dialog.showAlertDialog(context);
}
}
}).catchError((err) { }).catchError((err) {
GifLoaderDialogUtils.hideDialog(context); GifLoaderDialogUtils.hideDialog(context);
AppToast.showErrorToast(message: err); AppToast.showErrorToast(message: err);

@ -33,7 +33,7 @@
// //Stream to enable video // //Stream to enable video
// MediaStream localMediaStream; // MediaStream localMediaStream;
// MediaStream remoteMediaStream; // MediaStream remoteMediaStream;
// // Signaling signaling = Signaling(); // Signaling signaling = Signaling();
// //
// @override // @override
// void initState() { // void initState() {

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

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

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

@ -22,8 +22,9 @@ class InsuranceCardUpdateDetails extends StatelessWidget {
final String patientIdentificationID; final String patientIdentificationID;
final int patientID; final int patientID;
final String name; final String name;
final String mobileNo;
const InsuranceCardUpdateDetails({Key key, this.insuranceCardDetailsModel, this.patientIdentificationID, this.patientID, this.name}) : super(key: key); const InsuranceCardUpdateDetails({Key key, this.insuranceCardDetailsModel, this.patientIdentificationID, this.patientID, this.name, this.mobileNo}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -53,8 +54,7 @@ class InsuranceCardUpdateDetails extends StatelessWidget {
// height: projectViewModel.isArabic ? 320 : 240, // height: projectViewModel.isArabic ? 320 : 240,
// decoration: containerRadius(CustomColors.accentColor, 12), // decoration: containerRadius(CustomColors.accentColor, 12),
child: Container( child: Container(
decoration: cardRadius(12,color: CustomColors.accentColor), decoration: cardRadius(12, color: CustomColors.accentColor),
child: Padding( child: Padding(
padding: const EdgeInsets.all(12.0), padding: const EdgeInsets.all(12.0),
child: Column( child: Column(
@ -229,7 +229,6 @@ class InsuranceCardUpdateDetails extends StatelessWidget {
children: [ children: [
Container( Container(
child: Container( child: Container(
decoration: cardRadius(12), decoration: cardRadius(12),
child: Container( child: Container(
width: MediaQuery.of(context).size.width, width: MediaQuery.of(context).size.width,
@ -306,7 +305,8 @@ class InsuranceCardUpdateDetails extends StatelessWidget {
color: CustomColors.accentColor, color: CustomColors.accentColor,
small: true, small: true,
onTap: () async { onTap: () async {
confirmAttachInsuranceCardImageDialogDialog(context: context, name: name, fileNo: patientID.toString(), model: model); confirmAttachInsuranceCardImageDialogDialog(
context: context, name: name, fileNo: patientID.toString(), identificationNo: patientIdentificationID, mobileNo: mobileNo, model: model);
}, },
), ),
if (insuranceCardDetailsModel.isNotEmpty) if (insuranceCardDetailsModel.isNotEmpty)
@ -324,7 +324,6 @@ class InsuranceCardUpdateDetails extends StatelessWidget {
AppToast.showErrorToast(message: err.toString()); AppToast.showErrorToast(message: err.toString());
print(err); print(err);
}); });
}, },
), ),
if (insuranceCardDetailsModel.isNotEmpty) if (insuranceCardDetailsModel.isNotEmpty)
@ -337,7 +336,8 @@ class InsuranceCardUpdateDetails extends StatelessWidget {
label: TranslationBase.of(context).disagree.toUpperCase(), label: TranslationBase.of(context).disagree.toUpperCase(),
color: Colors.grey[800], color: Colors.grey[800],
onTap: () async { onTap: () async {
confirmAttachInsuranceCardImageDialogDialog(context: context, name: name, fileNo: patientID.toString(), model: model); confirmAttachInsuranceCardImageDialogDialog(
context: context, name: name, fileNo: patientID.toString(), identificationNo: patientIdentificationID, mobileNo: mobileNo, model: model);
}, },
) )
], ],
@ -349,12 +349,14 @@ class InsuranceCardUpdateDetails extends StatelessWidget {
); );
} }
void confirmAttachInsuranceCardImageDialogDialog({BuildContext context, String name, String fileNo, InsuranceViewModel model}) { void confirmAttachInsuranceCardImageDialogDialog({BuildContext context, String name, String fileNo, String identificationNo, String mobileNo, InsuranceViewModel model}) {
showDialog( showDialog(
context: context, context: context,
builder: (cxt) => AttachInsuranceCardImageDialog( builder: (cxt) => AttachInsuranceCardImageDialog(
fileNo: fileNo, fileNo: fileNo,
name: name, name: name,
identificationNo: identificationNo,
mobileNo: mobileNo,
image: (file, image) async { image: (file, image) async {
GifLoaderDialogUtils.showMyDialog(context); GifLoaderDialogUtils.showMyDialog(context);
await model.uploadInsuranceCard(context, patientIdentificationID: patientIdentificationID, patientID: patientID, image: image); await model.uploadInsuranceCard(context, patientIdentificationID: patientIdentificationID, patientID: patientID, image: image);

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

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

@ -1,6 +1,3 @@
import 'dart:math' as math;
import 'package:auto_size_text/auto_size_text.dart';
import 'package:diplomaticquarterapp/config/size_config.dart'; import 'package:diplomaticquarterapp/config/size_config.dart';
import 'package:diplomaticquarterapp/core/viewModels/dashboard_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/dashboard_view_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
@ -12,6 +9,7 @@ import 'package:diplomaticquarterapp/models/gradient_color.dart';
import 'package:diplomaticquarterapp/models/hmg_services.dart'; import 'package:diplomaticquarterapp/models/hmg_services.dart';
import 'package:diplomaticquarterapp/models/slider_data.dart'; import 'package:diplomaticquarterapp/models/slider_data.dart';
import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/all_habib_medical_service_page2.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/all_habib_medical_service_page2.dart';
import 'package:diplomaticquarterapp/pages/ErService/ErOptions.dart';
import 'package:diplomaticquarterapp/pages/landing/widgets/logged_slider_view.dart'; import 'package:diplomaticquarterapp/pages/landing/widgets/logged_slider_view.dart';
import 'package:diplomaticquarterapp/pages/landing/widgets/services_view.dart'; import 'package:diplomaticquarterapp/pages/landing/widgets/services_view.dart';
import 'package:diplomaticquarterapp/pages/landing/widgets/slider_view.dart'; import 'package:diplomaticquarterapp/pages/landing/widgets/slider_view.dart';
@ -289,9 +287,8 @@ class _HomePageFragment2State extends State<HomePageFragment2> {
flex: 1, flex: 1,
child: InkWell( child: InkWell(
onTap: () { onTap: () {
AuthenticatedUser user = projectViewModel.user; // Navigator.of(context).push(MaterialPageRoute(builder: (context) => ErOptions(isAppbar: true)));
if (projectViewModel.havePrivilege(82) || bypassPrivilageCheck) Navigator.of(context).push(MaterialPageRoute(builder: (context) => PackagesOfferTabPage(user))); Navigator.push(context, FadePage(page: ErOptions(isAppbar: true)));
projectViewModel.analytics.offerPackages.log();
}, },
child: Stack( child: Stack(
children: [ children: [
@ -306,7 +303,7 @@ class _HomePageFragment2State extends State<HomePageFragment2> {
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
// color: Color(0xFF2B353E), // color: Color(0xFF2B353E),
decoration: containerRadius(Color(0xFF2B353E), 20), decoration: containerRadius(CustomColors.accentColor, 20),
), ),
Container( Container(
width: double.infinity, width: double.infinity,
@ -331,9 +328,9 @@ class _HomePageFragment2State extends State<HomePageFragment2> {
left: 20, left: 20,
top: 12, top: 12,
child: Opacity( child: Opacity(
opacity: 0.04, opacity: 0.5,
child: SvgPicture.asset( child: SvgPicture.asset(
"assets/images/new/logo.svg", "assets/images/new/emergency_services_back.svg",
height: MediaQuery.of(context).size.width * 0.14, height: MediaQuery.of(context).size.width * 0.14,
), ),
), ),
@ -342,114 +339,73 @@ class _HomePageFragment2State extends State<HomePageFragment2> {
right: 20, right: 20,
top: 12, top: 12,
child: Opacity( child: Opacity(
opacity: 0.04, opacity: 0.5,
child: SvgPicture.asset( child: SvgPicture.asset(
"assets/images/new/logo.svg", "assets/images/new/emergency_services_back.svg",
height: MediaQuery.of(context).size.width * 0.14, height: MediaQuery.of(context).size.width * 0.14,
), ),
), ),
), ),
projectViewModel.isArabic
? Positioned(
right: -16,
top: 2,
child: Transform.rotate(
angle: math.pi / 4,
child: Container(
padding: EdgeInsets.only(left: 18, right: 18, top: 6, bottom: 3),
color: CustomColors.accentColor,
child: Text(
TranslationBase.of(context).newDes,
style: TextStyle(
color: Colors.white,
fontSize: 9,
height: 0.8,
letterSpacing: -0.27,
),
),
),
),
)
: Positioned(
left: -16,
top: 2,
child: Transform.rotate(
angle: -math.pi / 4,
child: Container(
padding: EdgeInsets.only(left: 18, right: 18, top: 6, bottom: 3),
color: CustomColors.accentColor,
child: Text(
TranslationBase.of(context).newDes,
style: TextStyle(
color: Colors.white,
fontSize: 9,
letterSpacing: -0.27,
height: 1.2,
),
),
),
),
),
Container( Container(
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
padding: EdgeInsets.only(left: projectViewModel.isArabic ? 20 : 25, right: projectViewModel.isArabic ? 25 : 20), padding: EdgeInsets.all(SizeConfig.widthMultiplier * 3.4),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
mFlex(3), Container(
AutoSizeText( child: SvgPicture.asset(
TranslationBase.of(context).offersdiscount, "assets/images/new/emergency_services.svg",
maxLines: 1, height: MediaQuery.of(context).size.width * 0.08,
style: TextStyle(
color: Colors.black,
fontSize: 14,
fontWeight: FontWeight.bold,
letterSpacing: -0.75,
height: 1,
),
),
projectViewModel.isArabic ? mHeight(4) : Container(),
Text(
TranslationBase.of(context).explore,
style: TextStyle(
color: Colors.black,
fontSize: 9,
fontWeight: FontWeight.w600,
letterSpacing: -0.27,
height: projectViewModel.isArabic ? 0.8 : 1,
), ),
), ),
mFlex(1), mFlex(1),
Row( Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
showFloating("assets/images/new/ear.svg"), Text(
mWidth(4), TranslationBase.of(context).emergencyServices,
showFloating("assets/images/new/head.svg"), style: TextStyle(
mWidth(4), color: Colors.black,
showFloating("assets/images/new/tooth.svg"), fontSize: 14,
fontWeight: FontWeight.bold,
letterSpacing: -0.45,
height: 1,
),
),
projectViewModel.isArabic ? mHeight(5) : Container(),
Text(
TranslationBase.of(context).emergencyServicesSubtitle,
style: TextStyle(
color: Colors.black,
fontSize: 9,
fontWeight: FontWeight.w600,
letterSpacing: -0.27,
height: projectViewModel.isArabic ? 0.2 : 1,
),
),
], ],
), ),
mFlex(2)
], ],
), ),
), ),
], ],
), ),
), ),
projectViewModel.havePrivilege(82) || bypassPrivilageCheck // projectViewModel.havePrivilege(82) || bypassPrivilageCheck
? Container() // ? Container()
: Container( // : Container(
width: double.infinity, // width: double.infinity,
height: double.infinity, // height: double.infinity,
clipBehavior: Clip.antiAlias, // clipBehavior: Clip.antiAlias,
decoration: containerRadiusWithGradientServices(20, lightColor: CustomColors.lightGreyColor.withOpacity(0.7), darkColor: CustomColors.lightGreyColor.withOpacity(0.7)), // decoration: containerRadiusWithGradientServices(20, lightColor: CustomColors.lightGreyColor.withOpacity(0.7), darkColor: CustomColors.lightGreyColor.withOpacity(0.7)),
child: Icon( // child: Icon(
Icons.lock_outline, // Icons.lock_outline,
size: 40, // size: 40,
), // ),
) // )
], ],
), ),
), ),
@ -500,7 +456,7 @@ class _HomePageFragment2State extends State<HomePageFragment2> {
left: 20, left: 20,
top: 12, top: 12,
child: Opacity( child: Opacity(
opacity: 0.04, opacity: 0.25,
child: SvgPicture.asset( child: SvgPicture.asset(
"assets/images/new/Pharmacy.svg", "assets/images/new/Pharmacy.svg",
height: MediaQuery.of(context).size.width * 0.15, height: MediaQuery.of(context).size.width * 0.15,
@ -511,7 +467,7 @@ class _HomePageFragment2State extends State<HomePageFragment2> {
right: 20, right: 20,
top: 12, top: 12,
child: Opacity( child: Opacity(
opacity: 0.04, opacity: 0.25,
child: SvgPicture.asset( child: SvgPicture.asset(
"assets/images/new/Pharmacy.svg", "assets/images/new/Pharmacy.svg",
height: MediaQuery.of(context).size.width * 0.15, height: MediaQuery.of(context).size.width * 0.15,
@ -527,8 +483,6 @@ class _HomePageFragment2State extends State<HomePageFragment2> {
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Container( Container(
color: Colors.yellow,
// width: MediaQuery.of(context).size.width * 0.065,
child: SvgPicture.asset( child: SvgPicture.asset(
"assets/images/new/Pharmacy.svg", "assets/images/new/Pharmacy.svg",
height: MediaQuery.of(context).size.width * 0.08, height: MediaQuery.of(context).size.width * 0.08,

@ -25,7 +25,6 @@ import 'package:diplomaticquarterapp/services/livecare_services/livecare_provide
import 'package:diplomaticquarterapp/services/robo_search/event_provider.dart'; import 'package:diplomaticquarterapp/services/robo_search/event_provider.dart';
import 'package:diplomaticquarterapp/theme/colors.dart'; import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/LocalNotification.dart'; import 'package:diplomaticquarterapp/uitl/LocalNotification.dart';
import 'package:diplomaticquarterapp/uitl/SignalRUtil.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';

@ -240,9 +240,11 @@ class _LiveCareHistoryCardState extends State<LiveCareHistoryCard> {
LiveCareService service = new LiveCareService(); LiveCareService service = new LiveCareService();
GifLoaderDialogUtils.showMyDialog(context); GifLoaderDialogUtils.showMyDialog(context);
service.sendLiveCareInvoiceEmail(widget.erRequestHistoryList.appointmentNo.toString(), widget.erRequestHistoryList.projectID, authUser.emailAddress, context).then((res) { service.sendLiveCareInvoiceEmail(widget.erRequestHistoryList.appointmentNo.toString(), widget.erRequestHistoryList.projectID, authUser.emailAddress, context).then((res) {
AppToast.showSuccessToast(message: TranslationBase(context).emailSentSuccessfully); GifLoaderDialogUtils.hideDialog(context);
AppToast.showSuccessToast(message: TranslationBase.of(context).emailSentSuccessfully);
}).catchError((err) { }).catchError((err) {
AppToast.showErrorToast(message: err); GifLoaderDialogUtils.hideDialog(context);
AppToast.showErrorToast(message: err.toString());
print(err); print(err);
}); });
} }

@ -1,21 +1,39 @@
import 'package:diplomaticquarterapp/core/model/ask_doctor/DoctorResponse.dart'; import 'package:diplomaticquarterapp/core/model/ask_doctor/DoctorResponse.dart';
import 'package:diplomaticquarterapp/core/service/medical/ask_doctor_services.dart';
import 'package:diplomaticquarterapp/core/viewModels/medical/ask_doctor_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/ask_doctor_view_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/date_uitl.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/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:provider/provider.dart';
class ViewDoctorResponsesPage extends StatelessWidget { class ViewDoctorResponsesPage extends StatefulWidget {
final DoctorResponse doctorResponse; final DoctorResponse doctorResponse;
const ViewDoctorResponsesPage({Key key, this.doctorResponse}) : super(key: key); const ViewDoctorResponsesPage({Key key, this.doctorResponse}) : super(key: key);
@override
State<ViewDoctorResponsesPage> createState() => _ViewDoctorResponsesPageState();
}
class _ViewDoctorResponsesPageState extends State<ViewDoctorResponsesPage> {
int rate = 1;
TextEditingController textController = new TextEditingController();
ProjectViewModel projectViewModel;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
projectViewModel = Provider.of(context);
return BaseView<AskDoctorViewModel>( return BaseView<AskDoctorViewModel>(
onModelReady: (model) => model.updateReadStatus(transactionNo: doctorResponse.transactionNo), onModelReady: (model) => model.updateReadStatus(transactionNo: widget.doctorResponse.transactionNo),
builder: (_, model, w) => AppScaffold( builder: (_, model, w) => AppScaffold(
isShowAppBar: true, isShowAppBar: true,
showNewAppBar: true, showNewAppBar: true,
@ -44,7 +62,7 @@ class ViewDoctorResponsesPage extends StatelessWidget {
itemBuilder: (context, _index) { itemBuilder: (context, _index) {
return Container( return Container(
padding: const EdgeInsets.only(left: 20, right: 12, top: 12, bottom: 12), padding: const EdgeInsets.only(left: 20, right: 12, top: 12, bottom: 12),
height: 130, height: 160,
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.all( borderRadius: BorderRadius.all(
Radius.circular(10.0), Radius.circular(10.0),
@ -64,7 +82,7 @@ class ViewDoctorResponsesPage extends StatelessWidget {
children: [ children: [
Container( Container(
child: Text( child: Text(
(doctorResponse.doctorName ?? ""), (widget.doctorResponse.doctorName ?? ""),
style: TextStyle( style: TextStyle(
fontSize: 16, fontSize: 16,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
@ -75,7 +93,7 @@ class ViewDoctorResponsesPage extends StatelessWidget {
), ),
Container( Container(
child: Text( child: Text(
(DateUtil.getDayMonthYearDateFormatted(DateUtil.convertStringToDate(doctorResponse.createdOn)) ?? ""), (DateUtil.getDayMonthYearDateFormatted(DateUtil.convertStringToDate(widget.doctorResponse.createdOn)) ?? ""),
style: TextStyle( style: TextStyle(
fontSize: 14, fontSize: 14,
color: Color(0xff2E303A), color: Color(0xff2E303A),
@ -86,7 +104,7 @@ class ViewDoctorResponsesPage extends StatelessWidget {
Container( Container(
margin: EdgeInsets.only(top: 10.0), margin: EdgeInsets.only(top: 10.0),
child: Text( child: Text(
doctorResponse.transactions[_index]['InfoStatusDescription'], widget.doctorResponse.transactions[_index]['DoctorResponse'],
style: TextStyle( style: TextStyle(
fontSize: 16, fontSize: 16,
color: Color(0xff2E303A), color: Color(0xff2E303A),
@ -94,11 +112,231 @@ class ViewDoctorResponsesPage extends StatelessWidget {
), ),
), ),
), ),
Container(
margin: EdgeInsets.only(top: 10.0),
child: DefaultButton(
TranslationBase.of(context).rateDoctorResponse,
() {
openResponseRateDialog(context);
},
color: CustomColors.accentColor,
),
),
], ],
), ),
); );
}, },
separatorBuilder: (context, index) => SizedBox(height: 14), separatorBuilder: (context, index) => SizedBox(height: 14),
itemCount: doctorResponse.transactions.length); itemCount: widget.doctorResponse.transactions.length);
}
void openResponseRateDialog(BuildContext context) {
showModalBottomSheet(
context: context,
enableDrag: true,
isDismissible: true,
isScrollControlled: true,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.only(topLeft: Radius.circular(12), topRight: Radius.circular(12)),
),
backgroundColor: Colors.white,
builder: (context) {
return StatefulBuilder(builder: (BuildContext context, StateSetter setState) {
return Container(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
SizedBox(
height: 16.0,
),
Text(
TranslationBase.of(context).rateDoctorResponseHeading,
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.w600,
color: Color(0xff2E303A),
letterSpacing: -0.64,
),
),
Padding(
padding: const EdgeInsets.all(24.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Container(
margin: rate == 1 ? EdgeInsets.only(left: 3.0, right: 3.0) : EdgeInsets.only(left: 0.0, right: 0.0),
decoration: rate == 1
? BoxDecoration(borderRadius: BorderRadius.circular(100), border: Border.all(width: 3, color: CustomColors.green))
: BoxDecoration(borderRadius: BorderRadius.circular(100), border: Border.all(width: 3, color: CustomColors.white)),
child: IconButton(
onPressed: () {
rate = 1;
setState(() {});
},
iconSize: 35,
icon: SvgPicture.asset('assets/images/new/appointment-rating/5.svg'),
),
),
Container(
margin: rate == 0 ? EdgeInsets.only(left: 3.0, right: 3.0) : EdgeInsets.only(left: 0.0, right: 0.0),
decoration: rate == 0
? BoxDecoration(borderRadius: BorderRadius.circular(100), border: Border.all(width: 3, color: CustomColors.green))
: BoxDecoration(borderRadius: BorderRadius.circular(100), border: Border.all(width: 3, color: CustomColors.white)),
child: IconButton(
onPressed: () {
rate = 0;
setState(() {});
},
iconSize: 35,
icon: SvgPicture.asset('assets/images/new/appointment-rating/1.svg'),
),
),
],
),
),
if (rate == 0)
Container(
padding: const EdgeInsets.all(24.0),
child: Padding(
padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
child: inputWidget(TranslationBase.of(context).comments, "", textController, isEnable: true),
),
),
SizedBox(
height: 16.0,
),
Container(
margin: EdgeInsets.fromLTRB(24.0, 0.0, 24.0, 24.0),
child: DefaultButton(
TranslationBase.of(context).submit,
() {
if (rate == 0 && textController.text.isEmpty) {
AppToast.showErrorToast(message: "Please enter comments");
} else {
rateDoctorResponse();
}
},
color: CustomColors.accentColor,
),
),
],
),
);
});
}).then((value) {
rate = 1;
setState(() {});
});
}
void rateDoctorResponse() {
GifLoaderDialogUtils.showMyDialog(context);
AskDoctorService service = new AskDoctorService();
service
.rateDoctorResponse(
transactionNo: widget.doctorResponse.transactionNo,
questionType: widget.doctorResponse.requestType,
rate: rate,
notes: textController.text,
mobileNo: projectViewModel.user.mobileNumber,
idNo: projectViewModel.user.patientIdentificationNo,
patientName: projectViewModel.user.firstName + " " + projectViewModel.user.lastName,
projectID: widget.doctorResponse.projectID,
language: projectViewModel.isArabic ? "ar" : "en")
.then((res) {
GifLoaderDialogUtils.hideDialog(context);
if (res['MessageStatus'] == 1) {
AppToast.showSuccessToast(message: res['SuccessMsg']);
Navigator.of(context).pop();
} else {
AppToast.showErrorToast(message: res['ErrorEndUserMessage']);
}
}).catchError((err) {
print(err);
GifLoaderDialogUtils.hideDialog(context);
});
}
Widget inputWidget(String _labelText, String _hintText, TextEditingController _controller, {String prefix, bool isEnable = true, bool hasSelection = false}) {
return Container(
padding: EdgeInsets.only(left: 16, right: 16, bottom: 15, top: 15),
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: isEnable ? Colors.white : CustomColors.grey2.withOpacity(0.4),
border: Border.all(
color: Color(0xffefefef),
width: 1,
),
),
child: InkWell(
onTap: hasSelection ? () {} : null,
child: Row(
children: [
Expanded(
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
_labelText,
style: TextStyle(
fontSize: 11,
fontWeight: FontWeight.w600,
color: Color(0xff2B353E),
letterSpacing: -0.44,
),
),
TextField(
enabled: isEnable,
scrollPadding: EdgeInsets.all(40.0),
keyboardType: TextInputType.text,
controller: _controller,
onChanged: (value) => {},
style: TextStyle(
fontSize: 14,
height: 21 / 14,
fontWeight: FontWeight.w400,
color: Color(0xff2B353E),
letterSpacing: -0.44,
),
decoration: InputDecoration(
isDense: true,
hintText: _hintText,
fillColor: CustomColors.accentColor,
hintStyle: TextStyle(
fontSize: isEnable ? 14 : 24,
height: 21 / 14,
fontWeight: FontWeight.w400,
color: isEnable ? Color(0xff575757) : CustomColors.black,
letterSpacing: -0.56,
),
prefixIconConstraints: BoxConstraints(minWidth: 50),
prefixIcon: prefix == null
? null
: Text(
"+" + prefix,
style: TextStyle(
fontSize: 14,
height: 21 / 14,
fontWeight: FontWeight.w500,
color: Color(0xff2E303A),
letterSpacing: -0.56,
),
),
contentPadding: EdgeInsets.zero,
border: InputBorder.none,
focusedBorder: InputBorder.none,
enabledBorder: InputBorder.none,
),
),
],
),
),
if (hasSelection) Icon(Icons.keyboard_arrow_down_outlined),
],
),
),
);
} }
} }

@ -3,6 +3,7 @@ import 'package:diplomaticquarterapp/core/viewModels/medical/ask_doctor_view_mod
import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart'; import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/pages/medical/balance/new_text_Field.dart'; import 'package:diplomaticquarterapp/pages/medical/balance/new_text_Field.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart'; import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
@ -26,7 +27,7 @@ class _RequestTypePageState extends State<RequestTypePage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BaseView<AskDoctorViewModel>( return BaseView<AskDoctorViewModel>(
onModelReady: (model) => model.getCallRequestTypeLOVs(), onModelReady: (model) => model.getQuestionTypes(),
builder: (_, model, w) => AppScaffold( builder: (_, model, w) => AppScaffold(
isShowAppBar: true, isShowAppBar: true,
appBarTitle: TranslationBase.of(context).requestType, appBarTitle: TranslationBase.of(context).requestType,
@ -109,8 +110,9 @@ class _RequestTypePageState extends State<RequestTypePage> {
TranslationBase.of(context).submit, TranslationBase.of(context).submit,
() => { () => {
model.sendRequestLOV(doctorList: widget.doctorList, requestType: parameterCode.toString(), remark: question).then((value) { model.sendRequestLOV(doctorList: widget.doctorList, requestType: parameterCode.toString(), remark: question).then((value) {
if (model.state != ViewState.ErrorLocal || model.state != ViewState.Error) { if (model.state != ViewState.ErrorLocal && model.state != ViewState.Error) {
Navigator.pop(context); Navigator.pop(context);
AppToast.showSuccessToast(message: TranslationBase.of(context).RRTRequestSuccess);
} }
}) })
}, },

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

@ -139,7 +139,10 @@ class _ConfirmPaymentPageState extends State<ConfirmPaymentPage> {
: Image.asset(getImagePath(widget.selectedPaymentMethod)), : Image.asset(getImagePath(widget.selectedPaymentMethod)),
), ),
Text( Text(
'${widget.advanceModel.amount} ' + TranslationBase.of(context).sar, widget.advanceModel.hospitalsModel.projectOutSA
? '${widget.advanceModel.amount} ' + TranslationBase.of(context).aed
: '${widget.advanceModel.amount} ' + TranslationBase.of(context).sar,
// '${widget.advanceModel.amount} ' + TranslationBase.of(context).sar,
style: TextStyle( style: TextStyle(
fontSize: 20, fontSize: 20,
fontWeight: FontWeight.w900, fontWeight: FontWeight.w900,

@ -106,7 +106,7 @@ class MyBalancePage extends StatelessWidget {
), ),
), ),
Text( Text(
TranslationBase.of(context).sar, projectViewModel.user.outSA == 1 ? TranslationBase.of(context).aed : TranslationBase.of(context).sar,
style: TextStyle( style: TextStyle(
fontSize: 16, fontSize: 16,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
@ -157,7 +157,7 @@ class MyBalancePage extends StatelessWidget {
), ),
), ),
Text( Text(
amount.toStringAsFixed(2) + " " + TranslationBase.of(context).sar, amount.toStringAsFixed(2) + " " + (projectViewModel.user.outSA == 1 ? TranslationBase.of(context).aed : TranslationBase.of(context).sar),
style: TextStyle( style: TextStyle(
fontSize: 16, fontSize: 16,
letterSpacing: -0.64, letterSpacing: -0.64,

@ -1,14 +1,22 @@
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'package:diplomaticquarterapp/core/model/labs/patient_lab_orders.dart'; import 'package:diplomaticquarterapp/core/model/labs/patient_lab_orders.dart';
import 'package:diplomaticquarterapp/core/viewModels/medical/labs_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/labs_view_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.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/gif_loader_dialog_utils.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart';
import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/uitl/utils.dart';
import 'package:diplomaticquarterapp/widgets/data_display/medical/LabResult/laboratory_result_widget.dart'; import 'package:diplomaticquarterapp/widgets/data_display/medical/LabResult/laboratory_result_widget.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:open_filex/open_filex.dart';
import 'package:path_provider/path_provider.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class LaboratoryResultPage extends StatefulWidget { class LaboratoryResultPage extends StatefulWidget {
@ -40,31 +48,73 @@ class _LaboratoryResultPageState extends State<LaboratoryResultPage> {
showNewAppBar: true, showNewAppBar: true,
showNewAppBarTitle: true, showNewAppBarTitle: true,
backgroundColor: Color(0xffF8F8F8), backgroundColor: Color(0xffF8F8F8),
body: ListView.builder( body: SingleChildScrollView(
physics: BouncingScrollPhysics(), child: Column(
padding: EdgeInsets.only(bottom: 12), children: [
itemBuilder: (context, index) => LaboratoryResultWidget( ListView.builder(
onTap: () async { physics: BouncingScrollPhysics(),
GifLoaderDialogUtils.showMyDialog(context); shrinkWrap: true,
await model.sendLabReportEmail( padding: EdgeInsets.only(bottom: 12),
itemBuilder: (context, index) => LaboratoryResultWidget(
onTap: () async {
GifLoaderDialogUtils.showMyDialog(context);
await model.sendLabReportEmail(patientLabOrder: widget.patientLabOrders, mes: TranslationBase.of(context).sendSuc, userObj: projectViewModel.user);
GifLoaderDialogUtils.hideDialog(context);
},
billNo: widget.patientLabOrders.invoiceNo,
// details: model.patientLabSpecialResult[index].resultDataHTML,
details: model.patientLabSpecialResult.isEmpty ? null : getSpecialResults(model),
orderNo: widget.patientLabOrders.orderNo,
patientLabOrder: widget.patientLabOrders, patientLabOrder: widget.patientLabOrders,
mes: TranslationBase.of(context).sendSuc, ),
userObj: projectViewModel.user, itemCount: 1,
isVidaPlus: Utils.isVidaPlusProject(projectViewModel, num.parse(widget.patientLabOrders.projectID))); ),
GifLoaderDialogUtils.hideDialog(context); SizedBox(
}, height: 120.0,
billNo: widget.patientLabOrders.invoiceNo, )
// details: model.patientLabSpecialResult[index].resultDataHTML, ],
details: model.patientLabSpecialResult.isEmpty ? null : getSpecialResults(model), ),
orderNo: widget.patientLabOrders.orderNo, ),
patientLabOrder: widget.patientLabOrders, bottomSheet: Container(
color: Colors.white,
height: MediaQuery.of(context).size.height * 0.081,
width: double.infinity,
padding: EdgeInsets.all(12.0),
child: Column(
children: <Widget>[
Container(
width: MediaQuery.of(context).size.width * 0.9,
child: DefaultButton(
TranslationBase.of(context).downloadReport,
() async {
GifLoaderDialogUtils.showMyDialog(context);
await model.sendLabReportEmail(patientLabOrder: widget.patientLabOrders, mes: TranslationBase.of(context).sendSuc, userObj: projectViewModel.user, isDownload: true);
GifLoaderDialogUtils.hideDialog(context);
try {
String path = await _createFileFromString(model.labReportPDF, "pdf");
OpenFilex.open(path);
} catch (ex) {
AppToast.showErrorToast(message: "Cannot open file.");
}
},
textColor: Colors.white,
),
),
],
), ),
itemCount: 1,
), ),
), ),
); );
} }
Future<String> _createFileFromString(String encodedStr, String ext) async {
Uint8List bytes = base64.decode(encodedStr);
String dir = (await getApplicationDocumentsDirectory()).path;
File file = File("$dir/" + DateTime.now().millisecondsSinceEpoch.toString() + "." + ext);
await file.writeAsBytes(bytes);
return file.path;
}
String getSpecialResults(LabsViewModel model) { String getSpecialResults(LabsViewModel model) {
String labResults = ""; String labResults = "";
model.patientLabSpecialResult.forEach((element) { model.patientLabSpecialResult.forEach((element) {

@ -1,9 +1,15 @@
import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart';
import 'package:diplomaticquarterapp/core/model/sick_leave/admission_status_for_sick_leave.dart';
import 'package:diplomaticquarterapp/core/model/sick_leave/sick_leave.dart';
import 'package:diplomaticquarterapp/core/service/medical/labs_service.dart';
import 'package:diplomaticquarterapp/core/viewModels/medical/patient_sick_leave_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/patient_sick_leave_view_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/pages/medical/sickleave_workplace_update_page.dart'; import 'package:diplomaticquarterapp/pages/medical/sickleave_workplace_update_page.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/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/uitl/utils.dart';
import 'package:diplomaticquarterapp/widgets/data_display/medical/doctor_card.dart'; import 'package:diplomaticquarterapp/widgets/data_display/medical/doctor_card.dart';
import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart';
import 'package:diplomaticquarterapp/widgets/dialogs/confirm_send_email_dialog.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/confirm_send_email_dialog.dart';
@ -110,20 +116,61 @@ class _PatientSickLeavePageState extends State<PatientSickLeavePage> {
); );
} }
void openWorkPlaceUpdatePage(int requestNumber, String setupID, PatientSickLeaveViewMode model, int index, int projectID) { Future<void> openWorkPlaceUpdatePage(int requestNumber, String setupID, PatientSickLeaveViewMode model, int index, int projectID) async {
if (model.sickLeaveList[index].admissionNo != 0 && model.sickLeaveList[index].admissionNo != null) {
getSickLeaveStatusByAdmissionNo(requestNumber, setupID, model, index, projectID);
} else {
openWorkPlaceUpdatePageFunc(requestNumber, setupID, model, index, projectID);
}
}
void getSickLeaveStatusByAdmissionNo(int requestNumber, String setupID, PatientSickLeaveViewMode model, int index, int projectID) {
AdmissionStatusForSickLeave admissionStatusForSickLeave;
LabsService service = new LabsService();
GifLoaderDialogUtils.showMyDialog(context);
service.getSickLeaveStatusByAdmissionNo(model.sickLeaveList[index].projectID, model.sickLeaveList[index].admissionNo).then((res) {
print(res);
GifLoaderDialogUtils.hideDialog(context);
if (res != null && res["List_GetSickLeaveStatusByAdmissionNo"] != null) {
if (res["List_GetSickLeaveStatusByAdmissionNo"].length != 0) {
admissionStatusForSickLeave = AdmissionStatusForSickLeave.fromJson(res["List_GetSickLeaveStatusByAdmissionNo"][0]);
if (admissionStatusForSickLeave.status != 6) {
AppToast.showErrorToast(message: TranslationBase.of(context).sickLeaveAdmittedPatient);
} else {
openWorkPlaceUpdatePageFunc(requestNumber, setupID, model, index, projectID);
}
} else {
openWorkPlaceUpdatePageFunc(requestNumber, setupID, model, index, projectID);
}
} else {
openWorkPlaceUpdatePageFunc(requestNumber, setupID, model, index, projectID);
}
}).catchError((err) {
GifLoaderDialogUtils.hideDialog(context);
print(err);
});
}
void openWorkPlaceUpdatePageFunc(int requestNumber, String setupID, PatientSickLeaveViewMode model, int index, int projectID) {
Navigator.push( Navigator.push(
context, context,
FadePage( FadePage(
page: WorkplaceUpdatePage( page: WorkplaceUpdatePage(
requestNumber: requestNumber, requestNumber: requestNumber,
setupID: setupID, setupID: setupID,
projectID: projectID, projectID: projectID,
))).then((value) { ),
print(value); ),
if (value != null && value == true) { ).then(
model.getSickLeave(); (value) {
showEmailDialog(model, index); print(value);
} if (value != null && value == true) {
}); model.getSickLeave();
showEmailDialog(model, index);
}
},
);
} }
} }

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

@ -1,14 +1,21 @@
import 'dart:ui'; import 'dart:ui';
import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart';
import 'package:diplomaticquarterapp/core/model/reports/admission_for_medical_report.dart';
import 'package:diplomaticquarterapp/core/viewModels/medical/reports_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/reports_view_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/extensions/string_extensions.dart'; import 'package:diplomaticquarterapp/extensions/string_extensions.dart';
import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart';
import 'package:diplomaticquarterapp/pages/medical/reports/inpatient_medical_reports_page.dart';
import 'package:diplomaticquarterapp/pages/medical/reports/report_list_widget.dart'; import 'package:diplomaticquarterapp/pages/medical/reports/report_list_widget.dart';
import 'package:diplomaticquarterapp/pages/medical/reports/reports_page.dart'; import 'package:diplomaticquarterapp/pages/medical/reports/reports_page.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/uitl/utils.dart';
import 'package:diplomaticquarterapp/uitl/utils_new.dart';
import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart'; import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart';
import 'package:diplomaticquarterapp/widgets/my_rich_text.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
@ -21,19 +28,20 @@ class HomeReportPage extends StatefulWidget {
} }
class _HomeReportPageState extends State<HomeReportPage> with SingleTickerProviderStateMixin { class _HomeReportPageState extends State<HomeReportPage> with SingleTickerProviderStateMixin {
TabController _tabController; TabController _tabController_new;
List<ImagesInfo> imagesInfo = List(); List<ImagesInfo> imagesInfo = List();
int _currentPage = 0;
@override @override
void initState() { void initState() {
_tabController_new = TabController(length: 2, vsync: this);
super.initState(); super.initState();
_tabController = TabController(length: 4, vsync: this);
} }
@override @override
void dispose() { void dispose() {
super.dispose(); super.dispose();
_tabController.dispose(); _tabController_new.dispose();
} }
@override @override
@ -46,7 +54,9 @@ class _HomeReportPageState extends State<HomeReportPage> with SingleTickerProvid
imagesInfo.add(ImagesInfo( imagesInfo.add(ImagesInfo(
imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/medical-reorts/en/2.png', imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/medical-reorts/ar/2.png')); imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/medical-reorts/en/2.png', imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/medical-reorts/ar/2.png'));
return BaseView<ReportsViewModel>( return BaseView<ReportsViewModel>(
onModelReady: (model) => model.getReports(), //model.getPrescriptions(), onModelReady: (model) {
model.getReports();
},
builder: (_, model, widget) => AppScaffold( builder: (_, model, widget) => AppScaffold(
isShowAppBar: true, isShowAppBar: true,
appBarTitle: TranslationBase.of(context).newMedReport, appBarTitle: TranslationBase.of(context).newMedReport,
@ -57,74 +67,245 @@ class _HomeReportPageState extends State<HomeReportPage> with SingleTickerProvid
showNewAppBarTitle: true, showNewAppBarTitle: true,
backgroundColor: Color(0xffF7F7F7), backgroundColor: Color(0xffF7F7F7),
imagesInfo: imagesInfo, imagesInfo: imagesInfo,
body: Column( body: Container(
children: [ child: Column(
TabBar( children: [
isScrollable: true, TabBar(
controller: _tabController, controller: _tabController_new,
indicatorWeight: 3.0, indicatorWeight: 3.0,
indicatorSize: TabBarIndicatorSize.tab, indicatorSize: TabBarIndicatorSize.tab,
labelColor: Color(0xff2B353E), labelColor: Color(0xff2B353E),
unselectedLabelColor: Color(0xff575757), unselectedLabelColor: Color(0xff575757),
labelPadding: EdgeInsets.only(top: 15, bottom: 13, left: 20, right: 20), labelPadding: EdgeInsets.only(top: 15, bottom: 13, left: 20, right: 20),
labelStyle: TextStyle( labelStyle: TextStyle(
fontSize: 16, fontSize: 16,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
letterSpacing: -0.48, letterSpacing: -0.48,
),
unselectedLabelStyle: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
letterSpacing: -0.48,
),
tabs: [
Text(
TranslationBase.of(context).requested,
style: TextStyle(fontFamily: projectViewModel.isArabic ? 'Cairo' : 'Poppins'),
),
Text(
TranslationBase.of(context).ready,
style: TextStyle(fontFamily: projectViewModel.isArabic ? 'Cairo' : 'Poppins'),
),
Text(
TranslationBase.of(context).completed,
style: TextStyle(fontFamily: projectViewModel.isArabic ? 'Cairo' : 'Poppins'),
), ),
Text( unselectedLabelStyle: TextStyle(
TranslationBase.of(context).cancelled, fontSize: 16,
style: TextStyle(fontFamily: projectViewModel.isArabic ? 'Cairo' : 'Poppins'), fontWeight: FontWeight.w600,
), letterSpacing: -0.48,
],
),
if (model.user != null)
Expanded(
child: TabBarView(
physics: BouncingScrollPhysics(),
controller: _tabController,
children: <Widget>[
ReportListWidget(reportList: model.reportsOrderRequestList, emailAddress: model.user.emailAddress),
ReportListWidget(reportList: model.reportsOrderReadyList, emailAddress: model.user.emailAddress),
ReportListWidget(reportList: model.reportsOrderCompletedList, emailAddress: model.user.emailAddress),
ReportListWidget(reportList: model.reportsOrderCanceledList, emailAddress: model.user.emailAddress),
],
), ),
onTap: (int value) {
print(value);
setState(() {});
},
tabs: [
Text(
TranslationBase.of(context).outpatient,
style: TextStyle(fontFamily: projectViewModel.isArabic ? 'Cairo' : 'Poppins'),
),
Text(
TranslationBase.of(context).inPatient,
style: TextStyle(fontFamily: projectViewModel.isArabic ? 'Cairo' : 'Poppins'),
),
],
), ),
if (projectViewModel.havePrivilege(21)) if (model.user != null)
Padding( Expanded(
padding: EdgeInsets.only(top: 16, bottom: 16, right: 21, left: 21), child: TabBarView(
child: DefaultButton( physics: BouncingScrollPhysics(),
TranslationBase.of(context).requestMedicalReport.toLowerCase().capitalizeFirstofEach, controller: _tabController_new,
() => Navigator.push( children: <Widget>[
context, Container(
FadePage( child: Column(
page: MedicalReports(), children: [
), Padding(
padding: EdgeInsets.all(21),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
myRadioButton(TranslationBase.of(context).requested, 0),
myRadioButton(TranslationBase.of(context).ready, 1),
myRadioButton(TranslationBase.of(context).cancelled, 2),
],
),
),
Expanded(
child: IndexedStack(
index: _currentPage,
children: [
ReportListWidget(reportList: model.reportsOrderRequestList, emailAddress: model.user.emailAddress),
ReportListWidget(reportList: model.reportsOrderReadyList, emailAddress: model.user.emailAddress),
ReportListWidget(reportList: model.reportsOrderCanceledList, emailAddress: model.user.emailAddress),
],
),
)
],
),
),
// InPatient Medical Reports
Container(
child: model.admissionsMedicalReportList.isNotEmpty
? Column(
children: [
Padding(
padding: const EdgeInsets.all(16.0),
child: Text(
TranslationBase.of(context).selectAdmissionText,
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xff2E303A), letterSpacing: -0.64, height: 25 / 16),
),
),
ListView.separated(
physics: BouncingScrollPhysics(),
shrinkWrap: true,
padding: EdgeInsets.only(left: 21, right: 21, top: 12, bottom: 12),
itemBuilder: (context, index) {
AdmissionMedicalReport admissionMedicalReport = model.admissionsMedicalReportList[index];
return InkWell(
onTap: () {
Navigator.push(
context,
FadePage(
page: InPatientMedicalReports(
admissionMedicalReport: admissionMedicalReport,
)));
},
child: Container(
// height: 100.0,
decoration: BoxDecoration(
borderRadius: BorderRadius.all(
Radius.circular(10.0),
),
boxShadow: [
BoxShadow(
color: Color(0xff000000).withOpacity(.05),
blurRadius: 27,
offset: Offset(0, -3),
),
],
color: Colors.white),
child: Padding(
padding: const EdgeInsets.all(12.0),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
TranslationBase.of(context).dr + " " + admissionMedicalReport.doctorNameObj,
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xff2E303A), letterSpacing: -0.64, height: 25 / 16),
),
Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Text(DateUtil.getDayMonthYearDateFormatted(DateUtil.convertStringToDate(admissionMedicalReport.admissionDate)),
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600, color: Color(0xff2B353E), letterSpacing: -0.48, height: 18 / 12)),
Text(admissionMedicalReport.projectName,
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600, color: Color(0xff2B353E), letterSpacing: -0.48, height: 18 / 12)),
],
),
],
),
Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
if (admissionMedicalReport.clinicName != null)
MyRichText(TranslationBase.of(context).clinic + ":", admissionMedicalReport.clinicName, projectViewModel.isArabic),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
MyRichText(
TranslationBase.of(context).status + ":",
projectViewModel.isArabic ? admissionMedicalReport.statusDescriptionN : admissionMedicalReport.statusDescription,
projectViewModel.isArabic),
Icon(
Icons.arrow_forward,
color: Theme.of(context).primaryColor,
)
],
),
],
),
),
],
)
],
),
),
),
);
},
separatorBuilder: (context, index) => SizedBox(
height: 16.0,
),
itemCount: model.admissionsMedicalReportList.length),
],
)
: getNoDataWidget(context),
)
],
), ),
), ),
if (projectViewModel.havePrivilege(21)
// && _tabController_new.index == 0
) )
], if (_tabController_new.index == 0)
Padding(
padding: EdgeInsets.only(top: 16, bottom: 16, right: 21, left: 21),
child: DefaultButton(
TranslationBase.of(context).requestMedicalReport.toLowerCase().capitalizeFirstofEach,
() => Navigator.push(
context,
FadePage(
page: MedicalReports(),
),
).then((value) {
model.getReports();
}),
),
)
],
),
), ),
), ),
); );
} }
Widget myRadioButton(String _label, int _value) {
return InkWell(
onTap: () {
setState(() {
_currentPage = _value;
});
},
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
SizedBox(
width: 22,
height: 22,
child: Radio(
value: _value,
activeColor: _value == _currentPage ? Color(0xffD02127) : Color(0xffE8E8E8),
groupValue: _currentPage,
onChanged: (index) {
setState(() {
_currentPage = index;
});
},
),
),
SizedBox(width: 10),
Text(
_label,
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
color: Color(0xff575757),
letterSpacing: -0.56,
),
),
],
),
);
}
} }

@ -1,8 +1,13 @@
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/core/model/reports/Reports.dart'; import 'package:diplomaticquarterapp/core/model/reports/Reports.dart';
import 'package:diplomaticquarterapp/core/service/medical/reports_service.dart'; import 'package:diplomaticquarterapp/core/service/medical/reports_service.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/locator.dart'; import 'package:diplomaticquarterapp/locator.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
@ -13,6 +18,8 @@ import 'package:diplomaticquarterapp/widgets/dialogs/confirm_send_email_dialog.d
import 'package:diplomaticquarterapp/widgets/my_rich_text.dart'; import 'package:diplomaticquarterapp/widgets/my_rich_text.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:open_filex/open_filex.dart';
import 'package:path_provider/path_provider.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:rating_bar/rating_bar.dart'; import 'package:rating_bar/rating_bar.dart';
@ -55,9 +62,24 @@ class ReportListWidget extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
if (report.doctorName != null) if (report.doctorName != null)
Text( Row(
report.doctorName, mainAxisAlignment: MainAxisAlignment.spaceBetween,
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xff2E303A), letterSpacing: -0.64, height: 25 / 16), crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
report.doctorName,
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xff2E303A), letterSpacing: -0.64, height: 25 / 16),
),
Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Text(DateUtil.getDayMonthYearDateFormatted(report.requestDate),
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600, color: Color(0xff2B353E), letterSpacing: -0.48, height: 18 / 12)),
Text(DateUtil.formatDateToTimeLang(report.requestDate, projectViewModel.isArabic),
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600, color: Color(0xff2B353E), letterSpacing: -0.48, height: 18 / 12)),
],
),
],
), ),
if (report.doctorName != null) SizedBox(height: 6), if (report.doctorName != null) SizedBox(height: 6),
Row( Row(
@ -75,8 +97,8 @@ class ReportListWidget extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: <Widget>[ children: <Widget>[
if (report.projectName != null) MyRichText(TranslationBase.of(context).clinic + ":", report.projectName, projectViewModel.isArabic), if (report.projectName != null) MyRichText(TranslationBase.of(context).hospital + ":", report.projectName, projectViewModel.isArabic),
if (report.clinicDescription != null) MyRichText(TranslationBase.of(context).hospital + ":", report.clinicDescription, projectViewModel.isArabic), if (report.clinicDescription != null) MyRichText(TranslationBase.of(context).clinic + ":", report.clinicDescription, projectViewModel.isArabic),
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
@ -93,14 +115,35 @@ class ReportListWidget extends StatelessWidget {
emptyIcon: Icons.star_border, emptyIcon: Icons.star_border,
), ),
if (reportList[index].status == 2) if (reportList[index].status == 2)
IconButton( Row(
icon: Icon(Icons.email), children: [
color: Color(0xff28323A), InkWell(
constraints: BoxConstraints(), onTap: () {
padding: EdgeInsets.zero, getMedicalReportPDF(report);
onPressed: () { },
showConfirmMessage(reportList[index]); child: Padding(
}) padding: const EdgeInsets.only(right: 11.0, left: 11.0),
child: Text(TranslationBase.of(context).viewReport,
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w600,
fontStyle: FontStyle.italic,
color: CustomColors.accentColor,
letterSpacing: -0.48,
height: 18 / 12,
decoration: TextDecoration.underline)),
),
),
IconButton(
icon: Icon(Icons.email),
color: Color(0xff28323A),
constraints: BoxConstraints(),
padding: EdgeInsets.zero,
onPressed: () {
showConfirmMessage(reportList[index]);
})
],
),
], ],
), ),
], ],
@ -130,6 +173,26 @@ class ReportListWidget extends StatelessWidget {
); );
} }
void getMedicalReportPDF(Reports report) {
GifLoaderDialogUtils.showMyDialog(AppGlobal.context);
ReportsService _reportsService = locator<ReportsService>();
_reportsService
.getMedicalReportPDF(report.projectName, report.clinicDescription, report.doctorName, DateUtil.convertDateToString(report.requestDate), report.invoiceNo.toString(), report.projectID,
DateUtil.convertDateToString(report.requestDate), report.setupId)
.then((value) async {
GifLoaderDialogUtils.hideDialog(AppGlobal.context);
try {
String path = await _createFileFromString(value["MedicalReportBase64"], "pdf");
OpenFilex.open(path);
} catch (ex) {
AppToast.showErrorToast(message: "Cannot open file.");
}
}).catchError((err) {
GifLoaderDialogUtils.hideDialog(AppGlobal.context);
print(err);
});
}
sendReportEmail(Reports report) { sendReportEmail(Reports report) {
GifLoaderDialogUtils.showMyDialog(AppGlobal.context); GifLoaderDialogUtils.showMyDialog(AppGlobal.context);
ReportsService _reportsService = locator<ReportsService>(); ReportsService _reportsService = locator<ReportsService>();
@ -144,4 +207,12 @@ class ReportListWidget extends StatelessWidget {
print(err); print(err);
}); });
} }
Future<String> _createFileFromString(String encodedStr, String ext) async {
Uint8List bytes = base64.decode(encodedStr);
String dir = (await getApplicationDocumentsDirectory()).path;
File file = File("$dir/" + DateTime.now().millisecondsSinceEpoch.toString() + "." + ext);
await file.writeAsBytes(bytes);
return file.path;
}
} }

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

@ -8,6 +8,7 @@ import 'package:diplomaticquarterapp/uitl/utils_new.dart';
import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -143,6 +144,9 @@ class _WorkplaceUpdatePageState extends State<WorkplaceUpdatePage> {
scrollPadding: EdgeInsets.zero, scrollPadding: EdgeInsets.zero,
keyboardType: TextInputType.name, keyboardType: TextInputType.name,
controller: _controller, controller: _controller,
inputFormatters: [
projectViewModel.isArabic ? FilteringTextInputFormatter.allow(RegExp("[ء-ي ]")) : FilteringTextInputFormatter.allow(RegExp("[a-zA-Z ]")),
],
onChanged: (value) => {_onPassportTextChanged(value)}, onChanged: (value) => {_onPassportTextChanged(value)},
style: TextStyle( style: TextStyle(
fontSize: 14, fontSize: 14,

@ -1,164 +1,164 @@
import 'dart:io'; // import 'dart:io';
//
import 'package:diplomaticquarterapp/models/LiveCare/IncomingCallData.dart'; // import 'package:diplomaticquarterapp/models/LiveCare/IncomingCallData.dart';
import 'package:diplomaticquarterapp/pages/livecare/incoming_call.dart'; // import 'package:diplomaticquarterapp/pages/livecare/incoming_call.dart';
import 'package:diplomaticquarterapp/pages/webRTC/signaling.dart'; // import 'package:diplomaticquarterapp/pages/webRTC/signaling.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; // import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:firebase_messaging/firebase_messaging.dart'; // import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart'; // import 'package:flutter/material.dart';
import 'package:flutter_webrtc/flutter_webrtc.dart'; // import 'package:flutter_webrtc/flutter_webrtc.dart';
//
class CallPage extends StatefulWidget { // class CallPage extends StatefulWidget {
@override // @override
_CallPageState createState() => _CallPageState(); // _CallPageState createState() => _CallPageState();
} // }
//
class _CallPageState extends State<CallPage> { // class _CallPageState extends State<CallPage> {
// Signaling signaling = Signaling(); // Signaling signaling = Signaling();
RTCVideoRenderer _localRenderer = RTCVideoRenderer(); // RTCVideoRenderer _localRenderer = RTCVideoRenderer();
RTCVideoRenderer _remoteRenderer = RTCVideoRenderer(); // RTCVideoRenderer _remoteRenderer = RTCVideoRenderer();
String roomId; // String roomId;
TextEditingController textEditingController = TextEditingController(text: ''); // TextEditingController textEditingController = TextEditingController(text: '');
//
@override // @override
void initState() { // void initState() {
_localRenderer.initialize(); // _localRenderer.initialize();
_remoteRenderer.initialize(); // _remoteRenderer.initialize();
//
// signaling.onRemoteStream = ((stream) { // // signaling.onRemoteStream = ((stream) {
// _remoteRenderer.srcObject = stream; // // _remoteRenderer.srcObject = stream;
// setState(() {}); // // setState(() {});
// }); // // });
//
fcmConfigure(); // fcmConfigure();
//
super.initState(); // super.initState();
} // }
//
@override // @override
void dispose() { // void dispose() {
_localRenderer.dispose(); // _localRenderer.dispose();
_remoteRenderer.dispose(); // _remoteRenderer.dispose();
super.dispose(); // super.dispose();
} // }
//
@override // @override
Widget build(BuildContext context) { // Widget build(BuildContext context) {
FirebaseMessaging.instance.getToken().then((value) { // FirebaseMessaging.instance.getToken().then((value) {
print('FCM_TOKEN: $value'); // print('FCM_TOKEN: $value');
}); // });
//
return AppScaffold( // return AppScaffold(
isShowAppBar: true, // isShowAppBar: true,
showNewAppBar: true, // showNewAppBar: true,
showNewAppBarTitle: true, // showNewAppBarTitle: true,
isShowDecPage: false, // isShowDecPage: false,
appBarTitle: "WebRTC Calling", // appBarTitle: "WebRTC Calling",
body: Column( // body: Column(
children: [ // children: [
SizedBox(height: 8), // SizedBox(height: 8),
Wrap( // Wrap(
children: [ // children: [
SizedBox( // SizedBox(
width: 8, // width: 8,
), // ),
ElevatedButton( // ElevatedButton(
onPressed: () { // onPressed: () {
dummyCall(); // dummyCall();
}, // },
child: Text("Call"), // child: Text("Call"),
), // ),
SizedBox( // SizedBox(
width: 8, // width: 8,
), // ),
ElevatedButton( // ElevatedButton(
onPressed: () { // onPressed: () {
// signaling.hangUp(_localRenderer); // signaling.hangUp(_localRenderer);
}, // },
child: Text("Hangup"), // child: Text("Hangup"),
) // )
], // ],
), // ),
SizedBox(height: 8), // SizedBox(height: 8),
Expanded( // Expanded(
child: Padding( // child: Padding(
padding: const EdgeInsets.all(0.0), // padding: const EdgeInsets.all(0.0),
child: Stack( // child: Stack(
children: [ // children: [
Positioned(top: 0.0, right: 0.0, left: 0.0, bottom: 0.0, child: RTCVideoView(_remoteRenderer)), // Positioned(top: 0.0, right: 0.0, left: 0.0, bottom: 0.0, child: RTCVideoView(_remoteRenderer)),
Positioned( // Positioned(
top: 20.0, // top: 20.0,
right: 100.0, // right: 100.0,
left: 20.0, // left: 20.0,
bottom: 300.0, // bottom: 300.0,
child: RTCVideoView(_localRenderer, mirror: true), // child: RTCVideoView(_localRenderer, mirror: true),
), // ),
], // ],
), // ),
), // ),
), // ),
Padding( // Padding(
padding: const EdgeInsets.all(8.0), // padding: const EdgeInsets.all(8.0),
child: Row( // child: Row(
mainAxisAlignment: MainAxisAlignment.center, // mainAxisAlignment: MainAxisAlignment.center,
children: [ // children: [
Text("Join the following Room: "), // Text("Join the following Room: "),
Flexible( // Flexible(
child: TextFormField( // child: TextFormField(
controller: textEditingController, // controller: textEditingController,
), // ),
) // )
], // ],
), // ),
), // ),
SizedBox(height: 8) // SizedBox(height: 8)
], // ],
), // ),
); // );
} // }
//
dummyCall() async { // dummyCall() async {
final json = { // final json = {
"callerID": "9920", // "callerID": "9920",
"receiverID": "2001273", // "receiverID": "2001273",
"msgID": "123", // "msgID": "123",
"notfID": "123", // "notfID": "123",
"notification_foreground": "true", // "notification_foreground": "true",
"count": "1", // "count": "1",
"message": "Doctor is calling ", // "message": "Doctor is calling ",
"AppointmentNo": "123", // "AppointmentNo": "123",
"title": "Rayyan Hospital", // "title": "Rayyan Hospital",
"ProjectID": "123", // "ProjectID": "123",
"NotificationType": "10", // "NotificationType": "10",
"background": "1", // "background": "1",
"doctorname": "Dr Sulaiman Al Habib", // "doctorname": "Dr Sulaiman Al Habib",
"clinicname": "ENT Clinic", // "clinicname": "ENT Clinic",
"speciality": "Speciality", // "speciality": "Speciality",
"appointmentdate": "Sun, 15th Dec, 2019", // "appointmentdate": "Sun, 15th Dec, 2019",
"appointmenttime": "09:00", // "appointmenttime": "09:00",
"type": "video", // "type": "video",
"session_id": // "session_id":
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImN0eSI6InR3aWxpby1mcGE7dj0xIn0.eyJqdGkiOiJTS2I2NjYyOWMzN2ZhOTM3YjFjNDI2Zjg1MTgyNWFmN2M0LTE1OTg3NzQ1MDYiLCJpc3MiOiJTS2I2NjYyOWMzN2ZhOTM3YjFjNDI2Zjg1MTgyNWFmN2M0Iiwic3ViIjoiQUNhYWQ1YTNmOGM2NGZhNjczNTY3NTYxNTc0N2YyNmMyYiIsImV4cCI6MTU5ODc3ODEwNiwiZ3JhbnRzIjp7ImlkZW50aXR5IjoiSGFyb29uMSIsInZpZGVvIjp7InJvb20iOiJTbWFsbERhaWx5U3RhbmR1cCJ9fX0.7XUS5uMQQJfkrBZu9EjQ6STL6R7iXkso6BtO1HmrQKk", // "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImN0eSI6InR3aWxpby1mcGE7dj0xIn0.eyJqdGkiOiJTS2I2NjYyOWMzN2ZhOTM3YjFjNDI2Zjg1MTgyNWFmN2M0LTE1OTg3NzQ1MDYiLCJpc3MiOiJTS2I2NjYyOWMzN2ZhOTM3YjFjNDI2Zjg1MTgyNWFmN2M0Iiwic3ViIjoiQUNhYWQ1YTNmOGM2NGZhNjczNTY3NTYxNTc0N2YyNmMyYiIsImV4cCI6MTU5ODc3ODEwNiwiZ3JhbnRzIjp7ImlkZW50aXR5IjoiSGFyb29uMSIsInZpZGVvIjp7InJvb20iOiJTbWFsbERhaWx5U3RhbmR1cCJ9fX0.7XUS5uMQQJfkrBZu9EjQ6STL6R7iXkso6BtO1HmrQKk",
"identity": "Haroon1", // "identity": "Haroon1",
"name": "SmallDailyStandup", // "name": "SmallDailyStandup",
"videoUrl": "video", // "videoUrl": "video",
"picture": "video", // "picture": "video",
"is_call": "true" // "is_call": "true"
}; // };
//
IncomingCallData incomingCallData = IncomingCallData.fromJson(json); // IncomingCallData incomingCallData = IncomingCallData.fromJson(json);
final result = await Navigator.push(context, MaterialPageRoute(builder: (context) => IncomingCall(incomingCallData: incomingCallData))); // final result = await Navigator.push(context, MaterialPageRoute(builder: (context) => IncomingCall(incomingCallData: incomingCallData)));
} // }
//
fcmConfigure() { // fcmConfigure() {
FirebaseMessaging.onMessage.listen((RemoteMessage message) async { // FirebaseMessaging.onMessage.listen((RemoteMessage message) async {
print(message.toString()); // print(message.toString());
//
IncomingCallData incomingCallData; // IncomingCallData incomingCallData;
if (Platform.isAndroid) // if (Platform.isAndroid)
incomingCallData = IncomingCallData.fromJson(message.data['data']); // incomingCallData = IncomingCallData.fromJson(message.data['data']);
else if (Platform.isIOS) incomingCallData = IncomingCallData.fromJson(message.data); // else if (Platform.isIOS) incomingCallData = IncomingCallData.fromJson(message.data);
if (incomingCallData != null) final result = await Navigator.push(context, MaterialPageRoute(builder: (context) => IncomingCall(incomingCallData: incomingCallData))); // if (incomingCallData != null) final result = await Navigator.push(context, MaterialPageRoute(builder: (context) => IncomingCall(incomingCallData: incomingCallData)));
}); // });
} // }
} // }

@ -91,7 +91,7 @@
// if (signalR != null) await signalR.closeConnection(); // if (signalR != null) await signalR.closeConnection();
// // https://vcallapi.hmg.com/webRTCHub?source=web&username=zohaib // // https://vcallapi.hmg.com/webRTCHub?source=web&username=zohaib
// // signalR = SignalRUtil(hubName: "https://vcallapi.hmg.com/webRTCHub?source=mobile&username=$userName"); // // signalR = SignalRUtil(hubName: "https://vcallapi.hmg.com/webRTCHub?source=mobile&username=$userName");
// // signalR = SignalRUtil(hubName: "http://35.193.237.29/webRTCHub?source=mobile&username=$userName"); // signalR = SignalRUtil(hubName: "http://35.193.237.29/webRTCHub?source=mobile&username=$userName");
// final connected = await signalR.openConnection(); // final connected = await signalR.openConnection();
// if (!connected) throw 'Failed to connect SignalR'; // if (!connected) throw 'Failed to connect SignalR';
// } // }
@ -125,7 +125,7 @@
// ] // ]
// }; // };
// //
// // SignalRUtil signalR; // SignalRUtil signalR;
// //
// RTCPeerConnection peerConnection; // RTCPeerConnection peerConnection;
// MediaStream localStream; // MediaStream localStream;

@ -82,7 +82,7 @@ var routes = {
APP_UPDATE: (_) => AppUpdatePage(), APP_UPDATE: (_) => AppUpdatePage(),
SETTINGS: (_) => Settings(), SETTINGS: (_) => Settings(),
CART_ORDER_PAGE: (_) => CartOrderPage(), CART_ORDER_PAGE: (_) => CartOrderPage(),
CALL_PAGE: (_) => CallPage(), // CALL_PAGE: (_) => CallPage(),
INCOMING_CALL_PAGE: (_) => IncomingCall(), INCOMING_CALL_PAGE: (_) => IncomingCall(),
OPENTOK_CALL_PAGE: (_) => OpenTokConnectCallPage( OPENTOK_CALL_PAGE: (_) => OpenTokConnectCallPage(
apiKey: OPENTOK_API_KEY, apiKey: OPENTOK_API_KEY,

@ -485,7 +485,7 @@ class DoctorsListService extends BaseService {
dynamic localRes; dynamic localRes;
await baseAppClient.post(GET_PATIENT_SHARE, onSuccess: (response, statusCode) async { await baseAppClient.post(GET_PATIENT_SHARE, onSuccess: (response, statusCode) async {
localRes = response['OnlineCheckInAppointments'][0]; localRes = response;
}, onFailure: (String error, int statusCode) { }, onFailure: (String error, int statusCode) {
throw error; throw error;
}, body: request); }, body: request);
@ -1623,11 +1623,12 @@ class DoctorsListService extends BaseService {
return Future.value(localRes); return Future.value(localRes);
} }
Future<Map> getLaserBodyPartsList(int laserCategoryID) async { Future<Map> getLaserBodyPartsList(int laserCategoryID, int projectID) async {
Map<String, dynamic> request; Map<String, dynamic> request;
request = { request = {
"LaserCategoryID": laserCategoryID, "LaserCategoryID": laserCategoryID,
"ProjectID": projectID,
}; };
dynamic localRes; dynamic localRes;
await baseAppClient.post(LASER_BODY_PARTS, onSuccess: (response, statusCode) async { await baseAppClient.post(LASER_BODY_PARTS, onSuccess: (response, statusCode) async {
@ -1768,6 +1769,45 @@ class DoctorsListService extends BaseService {
return Future.value(localRes); return Future.value(localRes);
} }
Future<Map> checkPatientNphiesEligibility(int projectID) async {
Map<String, dynamic> request;
request = {"ProjectID": projectID};
dynamic localRes;
await baseAppClient.post(CHECK_PATIENT_NPHIES_ELIGIBILITY, onSuccess: (response, statusCode) async {
localRes = response;
}, onFailure: (String error, int statusCode) {
throw error;
}, body: request);
return Future.value(localRes);
}
Future<Map> convertPatientToCash(int projectID) async {
Map<String, dynamic> request;
request = {"ProjectID": projectID};
dynamic localRes;
await baseAppClient.post(CONVERT_PATIENT_TO_CASH, onSuccess: (response, statusCode) async {
localRes = response;
}, onFailure: (String error, int statusCode) {
throw error;
}, body: request);
return Future.value(localRes);
}
Future<Map> getPayfortSDKTokenForPayment(String deviceID, String signatureValue, {bool isTest = true}) async {
Map<String, dynamic> request;
request = {"service_command": "SDK_TOKEN", "access_code": "BsM6He4FMBaZ86W64kjZ", "merchant_identifier": "ipxnRXXq", "language": "en", "device_id": deviceID, "signature": signatureValue};
dynamic localRes;
await baseAppClient.post(isTest ? PAYFORT_TEST_URL : PAYFORT_PROD_URL, onSuccess: (response, statusCode) async {
localRes = response;
}, onFailure: (String error, int statusCode) {
throw error;
}, body: request, isExternal: true, isAllowAny: true);
return Future.value(localRes);
}
Future<Map> logDoctorFreeSlots(int docID, int clinicID, int projectID, List<dynamic> selectedfreeSlots, dynamic appoNumber, BuildContext context, [ProjectViewModel projectViewModel]) async { Future<Map> logDoctorFreeSlots(int docID, int clinicID, int projectID, List<dynamic> selectedfreeSlots, dynamic appoNumber, BuildContext context, [ProjectViewModel projectViewModel]) async {
Map<String, dynamic> requestFreeSlots; Map<String, dynamic> requestFreeSlots;
Map<String, dynamic> request; Map<String, dynamic> request;
@ -1803,4 +1843,6 @@ class DoctorsListService extends BaseService {
return Future.value(localRes); return Future.value(localRes);
} }
} }

@ -281,15 +281,12 @@ class LiveCareService extends BaseService {
Future<Map> sendLiveCareInvoiceEmail(String appoNo, int projectID, String emailAddress, BuildContext context) async { Future<Map> sendLiveCareInvoiceEmail(String appoNo, int projectID, String emailAddress, BuildContext context) async {
Map<String, dynamic> request; Map<String, dynamic> request;
if (await this.sharedPref.getObject(USER_PROFILE) != null) { if (await this.sharedPref.getObject(USER_PROFILE) != null) {
var data = AuthenticatedUser.fromJson(await this.sharedPref.getObject(USER_PROFILE)); var data = AuthenticatedUser.fromJson(await this.sharedPref.getObject(USER_PROFILE));
authUser = data; authUser = data;
} }
request = {"To": emailAddress, "ProjectID": projectID, "AppointmentNo": appoNo}; request = {"To": emailAddress, "ProjectID": projectID, "AppointmentNo": appoNo};
dynamic localRes; dynamic localRes;
await baseAppClient.post(SEND_LIVECARE_INVOICE_EMAIL, onSuccess: (response, statusCode) async { await baseAppClient.post(SEND_LIVECARE_INVOICE_EMAIL, onSuccess: (response, statusCode) async {
localRes = response; localRes = response;
}, onFailure: (String error, int statusCode) { }, onFailure: (String error, int statusCode) {

@ -28,11 +28,55 @@ class LocalNotification {
} }
} }
_initialize() { _initialize() async {
var initializationSettingsAndroid = new AndroidInitializationSettings('app_icon'); try {
// var initializationSettingsIOS = IOSInitializationSettings(onDidReceiveLocalNotification: null); var initializationSettingsAndroid = new AndroidInitializationSettings('app_icon');
// var initializationSettings = InitializationSettings(android: initializationSettingsAndroid, iOS: initializationSettingsIOS); var initializationSettingsIOS = DarwinInitializationSettings(onDidReceiveLocalNotification: null);
// flutterLocalNotificationsPlugin.initialize(initializationSettings, onSelectNotification: _onNotificationClick); var initializationSettings = InitializationSettings(android: initializationSettingsAndroid, iOS: initializationSettingsIOS);
await flutterLocalNotificationsPlugin.initialize(
initializationSettings,
onDidReceiveNotificationResponse: (NotificationResponse notificationResponse) {
switch (notificationResponse.notificationResponseType) {
case NotificationResponseType.selectedNotification:
// selectNotificationStream.add(notificationResponse.payload);
break;
case NotificationResponseType.selectedNotificationAction:
// if (notificationResponse.actionId == navigationActionId) {
// selectNotificationStream.add(notificationResponse.payload);
// }
break;
}
},
onDidReceiveBackgroundNotificationResponse: notificationTapBackground,
);
} catch (ex) {}
// flutterLocalNotificationsPlugin.initialize(initializationSettings, onDidReceiveNotificationResponse: (NotificationResponse notificationResponse)
// {
// switch (notificationResponse.notificationResponseType) {
// case NotificationResponseType.selectedNotification:
// // selectNotificationStream.add(notificationResponse.payload);
// break;
// case NotificationResponseType.selectedNotificationAction:
// // if (notificationResponse.actionId == navigationActionId) {
// // selectNotificationStream.add(notificationResponse.payload);
// }
// // break;
// },}
//
// ,
//
// );
}
void notificationTapBackground(NotificationResponse notificationResponse) {
// ignore: avoid_print
print('notification(${notificationResponse.id}) action tapped: '
'${notificationResponse.actionId} with'
' payload: ${notificationResponse.payload}');
if (notificationResponse.input?.isNotEmpty ?? false) {
// ignore: avoid_print
print('notification action tapped with input: ${notificationResponse.input}');
}
} }
var _random = new Random(); var _random = new Random();
@ -55,11 +99,11 @@ class LocalNotification {
Future.delayed(Duration(seconds: 1)).then((result) async { Future.delayed(Duration(seconds: 1)).then((result) async {
var androidPlatformChannelSpecifics = AndroidNotificationDetails('com.hmg.local_notification', 'HMG', var androidPlatformChannelSpecifics = AndroidNotificationDetails('com.hmg.local_notification', 'HMG',
channelDescription: 'HMG', importance: Importance.max, priority: Priority.high, ticker: 'ticker', vibrationPattern: _vibrationPattern()); channelDescription: 'HMG', importance: Importance.max, priority: Priority.high, ticker: 'ticker', vibrationPattern: _vibrationPattern());
// var iOSPlatformChannelSpecifics = IOSNotificationDetails(); var iOSPlatformChannelSpecifics = DarwinNotificationDetails();
// var platformChannelSpecifics = NotificationDetails(android: androidPlatformChannelSpecifics, iOS: iOSPlatformChannelSpecifics); var platformChannelSpecifics = NotificationDetails(android: androidPlatformChannelSpecifics, iOS: iOSPlatformChannelSpecifics);
// await flutterLocalNotificationsPlugin.show(_randomNumber(), title, subtitle, platformChannelSpecifics, payload: payload).catchError((err) { await flutterLocalNotificationsPlugin.show(_randomNumber(), title, subtitle, platformChannelSpecifics, payload: payload).catchError((err) {
// print(err); print(err);
// }); });
}); });
} }
@ -84,18 +128,18 @@ class LocalNotification {
ledColor: const Color.fromARGB(255, 255, 0, 0), ledColor: const Color.fromARGB(255, 255, 0, 0),
ledOnMs: 1000, ledOnMs: 1000,
ledOffMs: 500); ledOffMs: 500);
// var iOSPlatformChannelSpecifics = IOSNotificationDetails(sound: 'slow_spring_board.aiff'); var iOSPlatformChannelSpecifics = DarwinNotificationDetails(sound: 'slow_spring_board.aiff');
// /change it to be as ionic // /change it to be as ionic
// var platformChannelSpecifics = NotificationDetails(android: androidPlatformChannelSpecifics, iOS: iOSPlatformChannelSpecifics); var platformChannelSpecifics = NotificationDetails(android: androidPlatformChannelSpecifics, iOS: iOSPlatformChannelSpecifics);
// await flutterLocalNotificationsPlugin.schedule(0, title, description, scheduledNotificationDateTime, platformChannelSpecifics); await flutterLocalNotificationsPlugin.schedule(0, title, description, scheduledNotificationDateTime, platformChannelSpecifics);
} }
///Repeat notification every day at approximately 10:00:00 am ///Repeat notification every day at approximately 10:00:00 am
Future showDailyAtTime() async { Future showDailyAtTime() async {
var time = Time(10, 0, 0); var time = Time(10, 0, 0);
var androidPlatformChannelSpecifics = AndroidNotificationDetails('repeatDailyAtTime channel id', 'repeatDailyAtTime channel name', channelDescription: 'repeatDailyAtTime description'); var androidPlatformChannelSpecifics = AndroidNotificationDetails('repeatDailyAtTime channel id', 'repeatDailyAtTime channel name', channelDescription: 'repeatDailyAtTime description');
// var iOSPlatformChannelSpecifics = IOSNotificationDetails(); var iOSPlatformChannelSpecifics = DarwinNotificationDetails();
// var platformChannelSpecifics = NotificationDetails( // var platformChannelSpecifics = NotificationDetails(
// androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics); // androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
// await flutterLocalNotificationsPlugin.showDailyAtTime( // await flutterLocalNotificationsPlugin.showDailyAtTime(
@ -110,7 +154,7 @@ class LocalNotification {
Future showWeeklyAtDayAndTime() async { Future showWeeklyAtDayAndTime() async {
var time = Time(10, 0, 0); var time = Time(10, 0, 0);
var androidPlatformChannelSpecifics = AndroidNotificationDetails('show weekly channel id', 'show weekly channel name', channelDescription: 'show weekly description'); var androidPlatformChannelSpecifics = AndroidNotificationDetails('show weekly channel id', 'show weekly channel name', channelDescription: 'show weekly description');
// var iOSPlatformChannelSpecifics = IOSNotificationDetails(); var iOSPlatformChannelSpecifics = DarwinNotificationDetails();
// var platformChannelSpecifics = NotificationDetails( // var platformChannelSpecifics = NotificationDetails(
// androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics); // androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
// await flutterLocalNotificationsPlugin.showWeeklyAtDayAndTime( // await flutterLocalNotificationsPlugin.showWeeklyAtDayAndTime(

@ -4,7 +4,7 @@
// import 'package:flutter/cupertino.dart'; // import 'package:flutter/cupertino.dart';
// import 'package:flutter_webrtc/flutter_webrtc.dart'; // import 'package:flutter_webrtc/flutter_webrtc.dart';
// import 'package:http/io_client.dart'; // import 'package:http/io_client.dart';
// // import 'package:signalr_core/signalr_core.dart'; // import 'package:signalr_core/signalr_core.dart';
// //
// class SignalRUtil { // class SignalRUtil {
// String hubName; // String hubName;
@ -20,7 +20,7 @@
// SignalRUtil({@required this.hubName}); // SignalRUtil({@required this.hubName});
// //
// //
// // HubConnection connectionHub; // HubConnection connectionHub;
// //
// closeConnection() async{ // closeConnection() async{
// if(connectionHub != null) { // if(connectionHub != null) {
@ -35,14 +35,14 @@
// } // }
// //
// Future<bool> openConnection() async { // Future<bool> openConnection() async {
// // connectionHub = HubConnectionBuilder() // connectionHub = HubConnectionBuilder()
// // .withUrl( // .withUrl(
// // hubName, // hubName,
// // HttpConnectionOptions( // HttpConnectionOptions(
// // logMessageContent: true, // logMessageContent: true,
// // client: IOClient(HttpClient()..badCertificateCallback = (x, y, z) => true), // client: IOClient(HttpClient()..badCertificateCallback = (x, y, z) => true),
// // logging: (level, message) => print(message), // logging: (level, message) => print(message),
// // )).build(); // )).build();
// //
// await connectionHub.start(); // await connectionHub.start();
// await Future.delayed(Duration(seconds: 1)); // await Future.delayed(Duration(seconds: 1));

@ -1071,6 +1071,8 @@ class TranslationBase {
String get sar => localizedValues['sar'][locale.languageCode]; String get sar => localizedValues['sar'][locale.languageCode];
String get aed => localizedValues['aed'][locale.languageCode];
String get payOnline => localizedValues['payOnline'][locale.languageCode]; String get payOnline => localizedValues['payOnline'][locale.languageCode];
String get cancelOrder => localizedValues['cancelOrder'][locale.languageCode]; String get cancelOrder => localizedValues['cancelOrder'][locale.languageCode];
@ -2891,6 +2893,21 @@ class TranslationBase {
String get pharmaLiveCareMakePayment1 => localizedValues["pharmaLiveCareMakePayment1"][locale.languageCode]; String get pharmaLiveCareMakePayment1 => localizedValues["pharmaLiveCareMakePayment1"][locale.languageCode];
String get pharmaLiveCareJoinConsultation => localizedValues["pharmaLiveCareJoinConsultation"][locale.languageCode]; String get pharmaLiveCareJoinConsultation => localizedValues["pharmaLiveCareJoinConsultation"][locale.languageCode];
String get pharmaLiveCareJoinConsultation1 => localizedValues["pharmaLiveCareJoinConsultation1"][locale.languageCode]; String get pharmaLiveCareJoinConsultation1 => localizedValues["pharmaLiveCareJoinConsultation1"][locale.languageCode];
String get emergencyServicesSubtitle => localizedValues["emergencyServicesSubtitle"][locale.languageCode];
String get rateDoctorResponse => localizedValues["rateDoctorResponse"][locale.languageCode];
String get comments => localizedValues["comments"][locale.languageCode];
String get rateDoctorResponseHeading => localizedValues["rateDoctorResponseHeading"][locale.languageCode];
String get updateInsuranceManuallyDialog => localizedValues["updateInsuranceManuallyDialog"][locale.languageCode];
String get viewReport => localizedValues["viewReport"][locale.languageCode];
String get sickLeaveAdmittedPatient => localizedValues["sickLeaveAdmittedPatient"][locale.languageCode];
String get dischargeDate => localizedValues["dischargeDate"][locale.languageCode];
String get selectAdmissionText => localizedValues["selectAdmissionText"][locale.languageCode];
String get invalidEligibility => localizedValues["invalidEligibility"][locale.languageCode];
String get invalidInsurance => localizedValues["invalidInsurance"][locale.languageCode];
String get continueCash => localizedValues["continueCash"][locale.languageCode];
String get updateInsuranceText => localizedValues["updateInsurance"][locale.languageCode];
String get downloadReport => localizedValues["downloadReport"][locale.languageCode];
String get habibCallCenter => localizedValues["habibCallCenter"][locale.languageCode];
} }

@ -819,6 +819,11 @@ class Utils {
}); });
return isVidaPlus; return isVidaPlus;
} }
static String generateSignature() {
}
} }
Widget applyShadow({Color color = Colors.grey, double shadowOpacity = 0.5, double spreadRadius = 2, double blurRadius = 7, Offset offset = const Offset(2, 2), @required Widget child}) { Widget applyShadow({Color color = Colors.grey, double shadowOpacity = 0.5, double spreadRadius = 2, double blurRadius = 7, Offset offset = const Offset(2, 2), @required Widget child}) {

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

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

@ -8,6 +8,7 @@ import 'package:diplomaticquarterapp/core/service/privilege_service.dart';
import 'package:diplomaticquarterapp/core/viewModels/appointment_rate_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/appointment_rate_view_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/pharmacyModule/pharmacy_module_view_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/extensions/string_extensions.dart';
import 'package:diplomaticquarterapp/models/Appointments/toDoCountProviderModel.dart'; import 'package:diplomaticquarterapp/models/Appointments/toDoCountProviderModel.dart';
import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart';
import 'package:diplomaticquarterapp/models/Authentication/check_activation_code_response.dart'; import 'package:diplomaticquarterapp/models/Authentication/check_activation_code_response.dart';
@ -20,6 +21,7 @@ import 'package:diplomaticquarterapp/pages/livecare/livecare_home.dart';
import 'package:diplomaticquarterapp/pages/rateAppointment/rate_appointment_doctor.dart'; import 'package:diplomaticquarterapp/pages/rateAppointment/rate_appointment_doctor.dart';
import 'package:diplomaticquarterapp/pages/webRTC/call_page.dart'; import 'package:diplomaticquarterapp/pages/webRTC/call_page.dart';
import 'package:diplomaticquarterapp/routes.dart'; import 'package:diplomaticquarterapp/routes.dart';
import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart';
import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart';
import 'package:diplomaticquarterapp/services/clinic_services/get_clinic_service.dart'; import 'package:diplomaticquarterapp/services/clinic_services/get_clinic_service.dart';
import 'package:diplomaticquarterapp/services/family_files/family_files_provider.dart'; import 'package:diplomaticquarterapp/services/family_files/family_files_provider.dart';
@ -28,6 +30,7 @@ import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/theme/theme_notifier.dart'; import 'package:diplomaticquarterapp/theme/theme_notifier.dart';
import 'package:diplomaticquarterapp/theme/theme_value.dart'; import 'package:diplomaticquarterapp/theme/theme_value.dart';
import 'package:diplomaticquarterapp/uitl/HMGNetworkConnectivity.dart'; import 'package:diplomaticquarterapp/uitl/HMGNetworkConnectivity.dart';
import 'package:diplomaticquarterapp/uitl/LocalNotification.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
@ -38,6 +41,14 @@ import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart';
import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart'; import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
// import 'package:flutter_amazonpaymentservices/environment_type.dart';
// import 'package:flutter_amazonpaymentservices/flutter_amazonpaymentservices.dart';
// import 'package:flutter_amazonpaymentservices/environment_type.dart';
// import 'package:flutter_amazonpaymentservices/flutter_amazonpaymentservices.dart';
// import 'package:flutter_amazonpaymentservices/flutter_amazonpaymentservices.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:in_app_review/in_app_review.dart'; import 'package:in_app_review/in_app_review.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -453,11 +464,22 @@ class _AppDrawerState extends State<AppDrawer> {
), ),
mHeight(12), mHeight(12),
InkWell( InkWell(
onTap: () { onTap: () async {
Navigator.push(context, FadePage(page: CallPage())); // var deviceId = await FlutterAmazonpaymentservices.getUDID;
GifLoaderDialogUtils.showMyDialog(context); // var signatureValue = "asD123@saereaccess_code=BsM6He4FMBaZ86W64kjZdevice_id=$deviceId" + "language=enmerchant_identifier=ipxnRXXqservice_command=SDK_TOKENasD123@saere";
HMGNetworkConnectivity(context).start(); // var signatureValueSHA = signatureValue.toSha256;
locator<GAnalytics>().hamburgerMenu.logMenuItemClick('cloud solution logo tap'); //
// GifLoaderDialogUtils.showMyDialog(context);
// DoctorsListService service = new DoctorsListService();
// service.getPayfortSDKTokenForPayment(deviceId, signatureValueSHA, isTest: true).then((res) {
// GifLoaderDialogUtils.hideDialog(context);
// print(res);
// startPaymentProcess(res['sdk_token']);
// }).catchError((err) {
// print(err);
// AppToast.showErrorToast(message: err);
// GifLoaderDialogUtils.hideDialog(context);
// });
}, },
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
@ -495,6 +517,34 @@ class _AppDrawerState extends State<AppDrawer> {
)); ));
} }
startPaymentProcess(String sdkToken) async {
// Map<String, String> requestParam = {};
// requestParam = {
// "amount": "100",
// "command": "PURCHASE",
// "currency": "SAR",
// "order_description": "Advance Payment",
// "customer_email": projectProvider.user.emailAddress,
// "customer_name": projectProvider.user.firstName + " " + projectProvider.user.lastName,
// "phone_number": projectProvider.user.mobileNumber,
// "language": projectProvider.isArabic ? "ar" : "en",
// "merchant_reference": DateTime.now().millisecondsSinceEpoch.toString(),
// "sdk_token": sdkToken,
// };
// try {
// await FlutterAmazonpaymentservices.normalPay(requestParam, EnvironmentType.sandbox, isShowResponsePage: false).then((value) {
// if (value["status"] == 14) {
// AppToast.showSuccessToast(message: "Payment has been successful");
// } else {
// AppToast.showErrorToast(message: value['response_message']);
// }
// });
// } on PlatformException catch (e) {
// AppToast.showErrorToast(message: e.message);
// return;
// }
}
readQRCode() async { readQRCode() async {
pharmacyLiveCareQRCode = (await BarcodeScanner.scan())?.rawContent; pharmacyLiveCareQRCode = (await BarcodeScanner.scan())?.rawContent;
print(pharmacyLiveCareQRCode); print(pharmacyLiveCareQRCode);
@ -512,7 +562,13 @@ class _AppDrawerState extends State<AppDrawer> {
startPharmacyLiveCareProcess() { startPharmacyLiveCareProcess() {
sharedPref.setString(LIVECARE_CLINIC_DATA, "Pharmacy LiveCare" + "-" + "501" + "-" + "7"); sharedPref.setString(LIVECARE_CLINIC_DATA, "Pharmacy LiveCare" + "-" + "501" + "-" + "7");
Navigator.push(context, FadePage(page: LiveCareHome(isPharmacyLiveCare: true, pharmacyLiveCareQRCode: pharmacyLiveCareQRCode,))); Navigator.push(
context,
FadePage(
page: LiveCareHome(
isPharmacyLiveCare: true,
pharmacyLiveCareQRCode: pharmacyLiveCareQRCode,
)));
} }
drawerNavigator(context, routeName) { drawerNavigator(context, routeName) {

@ -24,9 +24,7 @@ enum _PAYMENT_TYPE { PACKAGES, PHARMACY, PATIENT }
var _InAppBrowserOptions = InAppBrowserClassOptions( var _InAppBrowserOptions = InAppBrowserClassOptions(
inAppWebViewGroupOptions: InAppWebViewGroupOptions( inAppWebViewGroupOptions: InAppWebViewGroupOptions(
crossPlatform: InAppWebViewOptions(useShouldOverrideUrlLoading: true, transparentBackground: false), crossPlatform: InAppWebViewOptions(useShouldOverrideUrlLoading: true, transparentBackground: false),
ios: IOSInAppWebViewOptions( ios: IOSInAppWebViewOptions(applePayAPIEnabled: true, isFraudulentWebsiteWarningEnabled: false)),
applePayAPIEnabled: true,
)),
crossPlatform: InAppBrowserOptions(hideUrlBar: true, toolbarTopBackgroundColor: Colors.black), crossPlatform: InAppBrowserOptions(hideUrlBar: true, toolbarTopBackgroundColor: Colors.black),
android: AndroidInAppBrowserOptions(), android: AndroidInAppBrowserOptions(),
ios: IOSInAppBrowserOptions(hideToolbarBottom: true, toolbarBottomBackgroundColor: Colors.white, closeButtonColor: Colors.white, presentationStyle: IOSUIModalPresentationStyle.OVER_FULL_SCREEN)); ios: IOSInAppBrowserOptions(hideToolbarBottom: true, toolbarBottomBackgroundColor: Colors.white, closeButtonColor: Colors.white, presentationStyle: IOSUIModalPresentationStyle.OVER_FULL_SCREEN));
@ -127,17 +125,6 @@ class MyInAppBrowser extends InAppBrowser {
this.deviceToken = deviceToken; this.deviceToken = deviceToken;
} }
// getPatientData() async {
// if (await this.sharedPref.getObject(USER_PROFILE) != null) {
// var data = AuthenticatedUser.fromJson(await this.sharedPref.getObject(USER_PROFILE));
// authUser = data;
// }
// if (await this.sharedPref.getDouble(USER_LAT) != null && await this.sharedPref.getDouble(USER_LONG) != null) {
// lat = await this.sharedPref.getDouble(USER_LAT);
// long = await this.sharedPref.getDouble(USER_LONG);
// }
// }
openPackagesPaymentBrowser({@required int customer_id, @required int order_id}) { openPackagesPaymentBrowser({@required int customer_id, @required int order_id}) {
paymentType = _PAYMENT_TYPE.PACKAGES; paymentType = _PAYMENT_TYPE.PACKAGES;
var full_url = '$PACKAGES_REQUEST_PAYMENT_URL?customer_id=$customer_id&order_id=$order_id'; var full_url = '$PACKAGES_REQUEST_PAYMENT_URL?customer_id=$customer_id&order_id=$order_id';
@ -190,7 +177,7 @@ class MyInAppBrowser extends InAppBrowser {
service.applePayInsertRequest(applePayInsertRequest, context).then((res) { service.applePayInsertRequest(applePayInsertRequest, context).then((res) {
if (context != null) GifLoaderDialogUtils.hideDialog(context); if (context != null) GifLoaderDialogUtils.hideDialog(context);
String url = "https://hmgwebservices.com/HMGApplePayLive/applepay/pay?apq=" + res['result']; // Prod String url = "https://hmgwebservices.com/HMGApplePayLive/applepay/pay?apq=" + res['result']; // Prod
// String url = "https://uat.hmgwebservices.com/HMGApplePayLiveNew/applepay/pay?apq=" + res['result']; // UAT // String url = "https://uat.hmgwebservices.com/HMGApplePayLive/applepay/pay?apq=" + res['result']; // UAT
// safariBrowser.open(url: Uri.parse(url)); // safariBrowser.open(url: Uri.parse(url));
this.browser.openUrlRequest(urlRequest: URLRequest(url: Uri.parse(url)), options: _InAppBrowserOptions); this.browser.openUrlRequest(urlRequest: URLRequest(url: Uri.parse(url)), options: _InAppBrowserOptions);
}).catchError((err) { }).catchError((err) {

@ -298,12 +298,12 @@ class DoctorHeader extends StatelessWidget {
width: 100.0, width: 100.0,
margin: EdgeInsets.only(top: 10.0, left: 15.0, right: 15.0), margin: EdgeInsets.only(top: 10.0, left: 15.0, right: 15.0),
child: Text(TranslationBase.of(context).excellent, style: TextStyle(fontSize: 13.0, color: Colors.black, fontWeight: FontWeight.w600))), child: Text(TranslationBase.of(context).excellent, style: TextStyle(fontSize: 13.0, color: Colors.black, fontWeight: FontWeight.w600))),
getRatingLine(doctorDetailsList[0].patientNumber, Colors.green[700]), getRatingLine(doctorDetailsList[0].ratio, Colors.green[700]),
], ],
), ),
Container( Container(
margin: EdgeInsets.only(top: 10.0, left: 10.0, right: 10.0), margin: EdgeInsets.only(top: 10.0, left: 10.0, right: 10.0),
child: Text(getRatingWidth(doctorDetailsList[0].patientNumber).round().toString() + "%", child: Text(getRatingWidth(doctorDetailsList[0].ratio).round().toString() + "%",
style: TextStyle(fontSize: 14.0, color: Colors.black, fontWeight: FontWeight.w600)), style: TextStyle(fontSize: 14.0, color: Colors.black, fontWeight: FontWeight.w600)),
), ),
], ],
@ -319,12 +319,12 @@ class DoctorHeader extends StatelessWidget {
width: 100.0, width: 100.0,
margin: EdgeInsets.only(top: 10.0, left: 15.0, right: 15.0), margin: EdgeInsets.only(top: 10.0, left: 15.0, right: 15.0),
child: Text(TranslationBase.of(context).v_good, style: TextStyle(fontSize: 13.0, color: Colors.black, fontWeight: FontWeight.w600))), child: Text(TranslationBase.of(context).v_good, style: TextStyle(fontSize: 13.0, color: Colors.black, fontWeight: FontWeight.w600))),
getRatingLine(doctorDetailsList[1].patientNumber, Color(0xffB7B723)), getRatingLine(doctorDetailsList[1].ratio, Color(0xffB7B723)),
], ],
), ),
Container( Container(
margin: EdgeInsets.only(top: 10.0, left: 10.0, right: 10.0), margin: EdgeInsets.only(top: 10.0, left: 10.0, right: 10.0),
child: Text(getRatingWidth(doctorDetailsList[1].patientNumber).round().toString() + "%", child: Text(doctorDetailsList[1].ratio.round().toString() + "%",
style: TextStyle(fontSize: 14.0, color: Colors.black, fontWeight: FontWeight.w600)), style: TextStyle(fontSize: 14.0, color: Colors.black, fontWeight: FontWeight.w600)),
), ),
], ],
@ -340,12 +340,12 @@ class DoctorHeader extends StatelessWidget {
width: 100.0, width: 100.0,
margin: EdgeInsets.only(top: 10.0, left: 15.0, right: 15.0), margin: EdgeInsets.only(top: 10.0, left: 15.0, right: 15.0),
child: Text(TranslationBase.of(context).good, style: TextStyle(fontSize: 13.0, color: Colors.black, fontWeight: FontWeight.w600))), child: Text(TranslationBase.of(context).good, style: TextStyle(fontSize: 13.0, color: Colors.black, fontWeight: FontWeight.w600))),
getRatingLine(doctorDetailsList[2].patientNumber, Color(0xffEBA727)), getRatingLine(doctorDetailsList[2].ratio, Color(0xffEBA727)),
], ],
), ),
Container( Container(
margin: EdgeInsets.only(top: 10.0, left: 10.0, right: 10.0), margin: EdgeInsets.only(top: 10.0, left: 10.0, right: 10.0),
child: Text(getRatingWidth(doctorDetailsList[2].patientNumber).round().toString() + "%", child: Text(doctorDetailsList[2].ratio.round().toString() + "%",
style: TextStyle(fontSize: 14.0, color: Colors.black, fontWeight: FontWeight.w600)), style: TextStyle(fontSize: 14.0, color: Colors.black, fontWeight: FontWeight.w600)),
), ),
], ],
@ -361,12 +361,12 @@ class DoctorHeader extends StatelessWidget {
width: 100.0, width: 100.0,
margin: EdgeInsets.only(top: 10.0, left: 15.0, right: 15.0), margin: EdgeInsets.only(top: 10.0, left: 15.0, right: 15.0),
child: Text(TranslationBase.of(context).average, style: TextStyle(fontSize: 13.0, color: Colors.black, fontWeight: FontWeight.w600))), child: Text(TranslationBase.of(context).average, style: TextStyle(fontSize: 13.0, color: Colors.black, fontWeight: FontWeight.w600))),
getRatingLine(doctorDetailsList[3].patientNumber, Color(0xffEB7227)), getRatingLine(doctorDetailsList[3].ratio, Color(0xffEB7227)),
], ],
), ),
Container( Container(
margin: EdgeInsets.only(top: 10.0, left: 10.0, right: 10.0), margin: EdgeInsets.only(top: 10.0, left: 10.0, right: 10.0),
child: Text(getRatingWidth(doctorDetailsList[3].patientNumber).round().toString() + "%", child: Text(doctorDetailsList[3].ratio.round().toString() + "%",
style: TextStyle(fontSize: 14.0, color: Colors.black, fontWeight: FontWeight.w600)), style: TextStyle(fontSize: 14.0, color: Colors.black, fontWeight: FontWeight.w600)),
), ),
], ],
@ -383,12 +383,12 @@ class DoctorHeader extends StatelessWidget {
width: 100.0, width: 100.0,
margin: EdgeInsets.only(top: 10.0, left: 15.0, right: 15.0), margin: EdgeInsets.only(top: 10.0, left: 15.0, right: 15.0),
child: Text(TranslationBase.of(context).below_average, style: TextStyle(fontSize: 13.0, color: Colors.black, fontWeight: FontWeight.w600))), child: Text(TranslationBase.of(context).below_average, style: TextStyle(fontSize: 13.0, color: Colors.black, fontWeight: FontWeight.w600))),
getRatingLine(doctorDetailsList[4].patientNumber, Color(0xffE20C0C)), getRatingLine(doctorDetailsList[4].ratio, Color(0xffE20C0C)),
], ],
), ),
Container( Container(
margin: EdgeInsets.only(top: 10.0, left: 10.0, right: 10.0), margin: EdgeInsets.only(top: 10.0, left: 10.0, right: 10.0),
child: Text(getRatingWidth(doctorDetailsList[4].patientNumber).round().toString() + "%", child: Text(doctorDetailsList[4].ratio.round().toString() + "%",
style: TextStyle(fontSize: 14.0, color: Colors.black, fontWeight: FontWeight.w600)), style: TextStyle(fontSize: 14.0, color: Colors.black, fontWeight: FontWeight.w600)),
), ),
], ],
@ -410,12 +410,12 @@ class DoctorHeader extends StatelessWidget {
pageBuilder: (context, animation1, animation2) {}); pageBuilder: (context, animation1, animation2) {});
} }
double getRatingWidth(int patientNumber) { double getRatingWidth(double patientNumber) {
var width = (patientNumber / this.headerModel.totalReviews) * 100; var width = patientNumber;
return width.roundToDouble(); return width.roundToDouble();
} }
Widget getRatingLine(int patientNumber, Color color) { Widget getRatingLine(double patientNumber, Color color) {
return Container( return Container(
margin: EdgeInsets.only(top: 10.0), margin: EdgeInsets.only(top: 10.0),
child: Stack(children: [ child: Stack(children: [
@ -427,7 +427,7 @@ class DoctorHeader extends StatelessWidget {
), ),
), ),
SizedBox( SizedBox(
width: getRatingWidth(patientNumber) * 1.35, width: patientNumber * 1.35,
height: 4.0, height: 4.0,
child: Container( child: Container(
color: color, color: color,

@ -66,8 +66,9 @@ import 'package:flutter/material.dart';
import 'package:flutter_tts/flutter_tts.dart'; import 'package:flutter_tts/flutter_tts.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
// import 'package:speech_to_text/speech_recognition_error.dart'; import 'package:speech_to_text/speech_recognition_error.dart';
// import 'package:speech_to_text/speech_to_text.dart' as stt; import 'package:speech_to_text/speech_to_text.dart' as stt;
import 'package:speech_to_text/speech_to_text.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
class FloatingSearchButton extends StatefulWidget { class FloatingSearchButton extends StatefulWidget {
@ -83,7 +84,8 @@ class _FloatingSearchButton extends State<FloatingSearchButton> with TickerProvi
RobotProvider eventProvider = RobotProvider(); RobotProvider eventProvider = RobotProvider();
bool isLoading = false; bool isLoading = false;
bool isError = false; bool isError = false;
// stt.SpeechToText speech = stt.SpeechToText(); stt.SpeechToText speech = stt.SpeechToText();
FlutterTts tts = FlutterTts();
String error = ''; String error = '';
String _currentLocaleId = ""; String _currentLocaleId = "";
String lastError; String lastError;
@ -92,7 +94,6 @@ class _FloatingSearchButton extends State<FloatingSearchButton> with TickerProvi
double minSoundLevel = 50000; double minSoundLevel = 50000;
double maxSoundLevel = -50000; double maxSoundLevel = -50000;
String reconizedWord = ''; String reconizedWord = '';
FlutterTts flutterTts = FlutterTts();
var selectedLang; var selectedLang;
bool isSearching = false; bool isSearching = false;
Map results = {}; Map results = {};
@ -113,7 +114,7 @@ class _FloatingSearchButton extends State<FloatingSearchButton> with TickerProvi
void initState() { void initState() {
controller = AnimationController(vsync: this, duration: Duration(seconds: 1)); controller = AnimationController(vsync: this, duration: Duration(seconds: 1));
offset = Tween<Offset>(begin: Offset(0.0, 1.0), end: Offset(0.0, 0.0)).animate(controller); offset = Tween<Offset>(begin: Offset(0.0, 1.0), end: Offset(0.0, 0.0)).animate(controller);
startIosTts();
if (IS_VOICE_COMMAND_CLOSED == true) { if (IS_VOICE_COMMAND_CLOSED == true) {
controller.reverse(from: -1); controller.reverse(from: -1);
} else { } else {
@ -143,7 +144,7 @@ class _FloatingSearchButton extends State<FloatingSearchButton> with TickerProvi
if (p['startPopUp'] == 'true') { if (p['startPopUp'] == 'true') {
if (this.mounted) { if (this.mounted) {
new RoboSearch(context: context).showAlertDialog(context); new RoboSearch(context: context).showAlertDialog(context);
initSpeechState().then((value) => {startVoiceSearch()}); // initSpeechState().then((value) => {startVoiceSearch()});
} }
} }
}); });
@ -234,10 +235,19 @@ class _FloatingSearchButton extends State<FloatingSearchButton> with TickerProvi
])); ]));
} }
startVoiceSearch() async {
// bool available = await speech.initialize(onStatus: statusListener, onError: errorListener);
// _currentLocaleId = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar');
startIosTts() async{
await tts.setSharedInstance(true);
await tts.setLanguage("en-US");
tts.setIosAudioCategory(
IosTextToSpeechAudioCategory.playback,
[IosTextToSpeechAudioCategoryOptions.mixWithOthers],
IosTextToSpeechAudioMode.voicePrompt);
}
startVoiceSearch() async {
bool available = await speech.initialize();
_currentLocaleId = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar');
//
// if (available) { // if (available) {
// speech.listen( // speech.listen(
// onResult: resultListener, // onResult: resultListener,
@ -248,30 +258,37 @@ class _FloatingSearchButton extends State<FloatingSearchButton> with TickerProvi
// print("The user has denied the use of speech recognition."); // print("The user has denied the use of speech recognition.");
// } // }
// some time later... // some time later...
//speech.stop(); if(available) {
// speech.listen( speech.stop();
// onResult: resultListener, speech.listen(
// listenFor: Duration(seconds: 10), onResult: resultListener,
// localeId: _currentLocaleId == 'en' ? 'en-US' : 'ar-SA', listenFor: Duration(seconds: 10),
// onSoundLevelChange: soundLevelListener, localeId: _currentLocaleId == 'en' ? 'en-US' : 'ar-SA',
// cancelOnError: true, onSoundLevelChange: soundLevelListener,
// partialResults: true, cancelOnError: true,
// onDevice: true, partialResults: true,
// listenMode: ListenMode.deviceDefault); onDevice: true,
listenMode: ListenMode.deviceDefault);
}
} }
void resultListener(result) { void resultListener(result) {
_stopListening();
reconizedWord = result.recognizedWords; reconizedWord = result.recognizedWords;
event.setValue({"searchText": reconizedWord}); event.setValue({"searchText": reconizedWord});
if (result.finalResult == true) { if (result.finalResult == true) {
Future.delayed(const Duration(seconds: 1), () { Future.delayed(const Duration(seconds: 1), () {
_speak(reconizedWord); _speak(reconizedWord);
RoboSearch.closeAlertDialog(context); RoboSearch.closeAlertDialog(context);
//Navigator.of(context).pop(); //Navigator.of(context).pop();
}); });
} }
} }
void _stopListening() async {
await speech.stop();
// setState(() {});
}
Future _speak(reconizedWord) async { Future _speak(reconizedWord) async {
getPages(reconizedWord); getPages(reconizedWord);
} }
@ -315,10 +332,10 @@ class _FloatingSearchButton extends State<FloatingSearchButton> with TickerProvi
// }); // });
} }
// void errorListener(SpeechRecognitionError error) { void errorListener(SpeechRecognitionError error) {
// event.setValue({"searchText": 'null'}); event.setValue({"searchText": 'null'});
// RoboSearch.closeAlertDialog(context); RoboSearch.closeAlertDialog(context);
// } }
void statusListener(String status) { void statusListener(String status) {
//setState(() { //setState(() {
@ -807,7 +824,7 @@ class _FloatingSearchButton extends State<FloatingSearchButton> with TickerProvi
); );
} }
speak({isInit}) async { speak({isInit =false}) async {
//if (mounted) { //if (mounted) {
setState(() { setState(() {
this.networkImage = results['AnimationURL']; this.networkImage = results['AnimationURL'];
@ -817,12 +834,18 @@ class _FloatingSearchButton extends State<FloatingSearchButton> with TickerProvi
if (isInit == true) { if (isInit == true) {
event.setValue({"animationEnable": 'true'}); event.setValue({"animationEnable": 'true'});
} }
// var voice = await tts.getVoice();
// print(voice);
if (isArabic == false && results['ReturnMessage'] != null && isInit == false) { if (isArabic == false && results['ReturnMessage'] != null && isInit == false) {
await flutterTts.setVoice({"name": "en-au-x-aub-network", "locale": "en-AU"}); // await tts.synthesizeToFile("Hello World", Platform.isAndroid ? "tts.wav" : "tts.caf");
await flutterTts.speak(results['ReturnMessage']);
await tts.setVoice({"name": "Karen", "locale": "en-AU"});
// await tts.setVoice({"name" : voice[35]["name"],"locale": voice[35]["locale"]});
await tts.speak(results['ReturnMessage']);
} else if (results['ReturnMessage_Ar'] != null && isInit == false) { } else if (results['ReturnMessage_Ar'] != null && isInit == false) {
await flutterTts.setVoice({"name": "ar-xa-x-ard-network", "locale": "ar"}); //await tts.setVoice({"name" : voice[0]["name"],"locale": voice[0]["locale"]});
await flutterTts.speak(results['ReturnMessage_Ar']); await tts.speak(results['ReturnMessage_Ar']);
} }
stopAnimation(isInit: isInit); stopAnimation(isInit: isInit);
@ -850,7 +873,7 @@ class _FloatingSearchButton extends State<FloatingSearchButton> with TickerProvi
} }
initialSpeak() async { initialSpeak() async {
await flutterTts.awaitSpeakCompletion(true); // await flutterTts.awaitSpeakCompletion(true);
results = { results = {
'ReturnMessage_Ar': "هذه الخدمة تم تصميمها لتتمكن من ربط الملفات الطبية للعائلة بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي.", 'ReturnMessage_Ar': "هذه الخدمة تم تصميمها لتتمكن من ربط الملفات الطبية للعائلة بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي.",
'ReturnMessage': "Through this service, you will be able to link your family medical files to your medical file so that you can manage their records by login to your medical file." 'ReturnMessage': "Through this service, you will be able to link your family medical files to your medical file so that you can manage their records by login to your medical file."
@ -875,21 +898,21 @@ class _FloatingSearchButton extends State<FloatingSearchButton> with TickerProvi
}); });
}); });
} else { } else {
flutterTts.setCompletionHandler(() async { // tts.setCompletionHandler(() async {
event.setValue({"animationEnable": 'false'}); // event.setValue({"animationEnable": 'false'});
setState(() { // setState(() {
this.networkImage = null; // this.networkImage = null;
this.isAnimationEnable = false; // this.isAnimationEnable = false;
}); // });
}); // });
} }
flutterTts.setCompletionHandler(() async { // flutterTts.setCompletionHandler(() async {
event.setValue({"animationEnable": 'false'}); // event.setValue({"animationEnable": 'false'});
setState(() { // setState(() {
this.networkImage = null; // this.networkImage = null;
this.isAnimationEnable = false; // this.isAnimationEnable = false;
}); // });
}); // });
} }
signOut() async { signOut() async {

@ -1,7 +1,7 @@
name: diplomaticquarterapp name: diplomaticquarterapp
description: A new Flutter application. description: A new Flutter application.
version: 4.5.63+1 version: 4.5.026+4050026
environment: environment:
sdk: ">=2.7.0 <3.0.0" sdk: ">=2.7.0 <3.0.0"
@ -15,7 +15,7 @@ dependencies:
sdk: flutter sdk: flutter
intl: ^0.17.0 intl: ^0.17.0
# web view # web view
# webview_flutter: ^2.3.1 # webview_flutter: ^2.3.1
# http client # http client
http: ^0.13.4 http: ^0.13.4
@ -23,7 +23,7 @@ dependencies:
async: ^2.8.1 async: ^2.8.1
audio_wave: ^0.1.4 audio_wave: ^0.1.4
# audio_session: ^0.1.13 # audio_session: ^0.1.13
# State Management # State Management
provider: ^6.0.1 provider: ^6.0.1
@ -54,7 +54,7 @@ dependencies:
maps_launcher: ^2.0.1 maps_launcher: ^2.0.1
url_launcher: ^6.0.15 url_launcher: ^6.0.15
shared_preferences: ^2.0.0 shared_preferences: ^2.0.0
# flutter_flexible_toast: ^0.1.4 # flutter_flexible_toast: ^0.1.4
fluttertoast: ^8.0.8 fluttertoast: ^8.0.8
firebase_messaging: ^14.1.0 firebase_messaging: ^14.1.0
firebase_analytics: ^10.0.5 firebase_analytics: ^10.0.5
@ -95,10 +95,10 @@ dependencies:
# Qr code Scanner TODO fix it # Qr code Scanner TODO fix it
# barcode_scanner: ^1.0.1 # barcode_scanner: ^1.0.1
flutter_polyline_points: ^1.0.0 # flutter_polyline_points: ^1.0.0
location: ^4.3.0 location: ^4.3.0
# Qr code Scanner # Qr code Scanner
# barcode_scan_fix: ^1.0.2 # barcode_scan_fix: ^1.0.2
barcode_scan2: ^4.2.2 barcode_scan2: ^4.2.2
# Rating Stars # Rating Stars
@ -108,7 +108,7 @@ dependencies:
syncfusion_flutter_calendar: ^19.3.55 syncfusion_flutter_calendar: ^19.3.55
# SVG Images # SVG Images
# flutter_svg: ^0.23.0+1 # flutter_svg: ^0.23.0+1
#Calendar Events #Calendar Events
manage_calendar_events: ^2.0.1 manage_calendar_events: ^2.0.1
@ -152,7 +152,7 @@ dependencies:
#google maps places #google maps places
google_maps_place_picker_mb: ^3.0.0 google_maps_place_picker_mb: ^3.0.0
# google_maps_place_picker: ^2.1.0-nullsafety.3 # google_maps_place_picker: ^2.1.0-nullsafety.3
map_launcher: ^1.1.3 map_launcher: ^1.1.3
#countdown timer for Upcoming List #countdown timer for Upcoming List
flutter_countdown_timer: ^4.1.0 flutter_countdown_timer: ^4.1.0
@ -161,10 +161,10 @@ dependencies:
native_device_orientation: ^1.0.0 native_device_orientation: ^1.0.0
wakelock: ^0.5.6 wakelock: ^0.5.6
after_layout: ^1.1.0 after_layout: ^1.1.0
# twilio_programmable_video: ^0.11.0+1 # twilio_programmable_video: ^0.11.0+1
cached_network_image: ^3.1.0+1 cached_network_image: ^3.1.0+1
# flutter_tts: # flutter_tts:
# path: flutter_tts-voice_enhancement # path: flutter_tts-voice_enhancement
flutter_tts: ^3.6.1 flutter_tts: ^3.6.1
wifi: ^0.1.5 wifi: ^0.1.5
@ -174,8 +174,8 @@ dependencies:
geofencing: ^0.1.0 geofencing: ^0.1.0
# speech_to_text: ^6.1.1 speech_to_text: ^6.1.1
# path: speech_to_text # path: speech_to_text
in_app_update: ^3.0.0 in_app_update: ^3.0.0
@ -183,7 +183,7 @@ dependencies:
badges: ^2.0.1 badges: ^2.0.1
flutter_app_icon_badge: ^2.0.0 flutter_app_icon_badge: ^2.0.0
syncfusion_flutter_sliders: ^19.3.55 # syncfusion_flutter_sliders: ^19.3.55
searchable_dropdown: ^1.1.3 searchable_dropdown: ^1.1.3
dropdown_search: 0.4.9 dropdown_search: 0.4.9
youtube_player_flutter: ^8.0.0 youtube_player_flutter: ^8.0.0
@ -191,29 +191,35 @@ dependencies:
# Dep by Zohaib # Dep by Zohaib
shimmer: ^2.0.0 shimmer: ^2.0.0
carousel_slider: ^4.0.0 carousel_slider: ^4.0.0
flutter_material_pickers: ^3.1.2 # flutter_material_pickers: ^3.1.2
flutter_staggered_grid_view: ^0.4.1 flutter_staggered_grid_view: ^0.4.1
# flutter_hms_gms_availability: ^2.0.0 # flutter_hms_gms_availability: ^2.0.0
huawei_hmsavailability: ^6.6.0+300 huawei_hmsavailability: ^6.6.0+300
huawei_location: 6.0.0+302 huawei_location: 6.0.0+302
# Marker Animation # Marker Animation
flutter_animarker: ^3.2.0 # flutter_animarker: ^3.2.0
auto_size_text: ^3.0.0 auto_size_text: ^3.0.0
equatable: ^2.0.3 equatable: ^2.0.3
signalr_core: ^1.1.1 # signalr_core: ^1.1.1
wave: ^0.2.0 wave: ^0.2.0
# sms_retriever: ^1.0.0 # sms_retriever: ^1.0.0
sms_otp_auto_verify: ^2.1.0 sms_otp_auto_verify: ^2.1.0
flutter_ios_voip_kit: ^0.0.5 flutter_ios_voip_kit: ^0.0.5
google_api_availability: ^3.0.1 google_api_availability: ^3.0.1
# flutter_callkit_incoming: ^1.0.3+3 # open_file: ^3.2.1
# firebase_core: 1.12.0 open_filex: ^4.3.2
path_provider: ^2.0.8
# flutter_callkit_incoming: ^1.0.3+3
# firebase_core: 1.12.0
# flutter_amazonpaymentservices: 0.0.6
# crypto:
dependency_overrides: dependency_overrides:
provider : ^5.0.0 provider: ^5.0.0
# permission_handler : ^10.2.0 # permission_handler : ^10.2.0
flutter_svg: ^1.0.0 flutter_svg: ^1.1.6
# firebase_messaging_platform_interface: any # firebase_messaging_platform_interface: any
# flutter_inappwebview: 5.7.2+3 # flutter_inappwebview: 5.7.2+3
# git: # git:

@ -1,5 +1,6 @@
import 'package:json_annotation/json_annotation.dart'; import 'package:json_annotation/json_annotation.dart';
part 'speech_recognition_error.g.dart'; part 'speech_recognition_error.g.dart';
/// A single error returned from the underlying speech services. /// A single error returned from the underlying speech services.

Loading…
Cancel
Save