Compare commits

...

3 Commits

Author SHA1 Message Date
Faiz Hashmi cb50054201 Chnages for lab 1 month ago
Faiz Hashmi 0bf40f3995 Chnages for lab 1 month ago
Faiz Hashmi 81b6117161 qLine Lab integration started. 2 months ago

@ -0,0 +1,4 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M15.8333 3.99984C15.8333 3.26346 16.4303 2.6665 17.1667 2.6665H29.1667C29.903 2.6665 30.5 3.26346 30.5 3.99984C30.5 4.73622 29.903 5.33317 29.1667 5.33317L29.1667 23.3332C29.1667 26.6469 26.4804 29.3332 23.1667 29.3332C19.853 29.3332 17.1667 26.6469 17.1667 23.3332L17.1667 9.33405C17.1667 9.33376 17.1667 9.33434 17.1667 9.33405C17.1667 9.33376 17.1667 9.33259 17.1667 9.33229V5.33317C16.4303 5.33317 15.8333 4.73622 15.8333 3.99984ZM19.8333 7.99984V5.33317H26.5L26.5 13.0676C26.1378 13.317 25.8055 13.5125 25.4733 13.6324C25.0059 13.8012 24.5708 13.8095 24.0425 13.4925C22.6945 12.6837 21.4241 12.879 20.3715 13.4052C20.1897 13.4961 20.0098 13.5996 19.8333 13.7111V10.6665H22.5C23.2364 10.6665 23.8333 10.0695 23.8333 9.33317C23.8333 8.59679 23.2364 7.99984 22.5 7.99984H19.8333Z" fill="#2E3039"/>
<path d="M7.14104 12.6116C7.52794 12.2404 8.13873 12.2404 8.52562 12.6116L8.53329 12.6193C8.69353 12.7817 9.1478 13.2422 9.40228 13.5185C9.91854 14.0791 10.6087 14.8721 11.3012 15.7994C11.9917 16.7239 12.6985 17.8007 13.2361 18.9287C13.7693 20.0478 14.1667 21.2805 14.1667 22.4998C14.1667 24.7601 13.4124 26.4319 12.1558 27.5235C10.9246 28.5931 9.33325 28.9998 7.83333 28.9998C6.33342 28.9998 4.74203 28.5931 3.51084 27.5235C2.25425 26.4319 1.5 24.7601 1.5 22.4998C1.5 21.2805 1.89732 20.0478 2.4306 18.9287C2.96813 17.8007 3.67498 16.7239 4.36544 15.7994C5.05795 14.8721 5.74813 14.0791 6.26439 13.5185C6.51888 13.2422 6.97318 12.7817 7.1334 12.6193L7.14104 12.6116Z" fill="#2E3039"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@ -95,7 +95,8 @@ class ApiClientImp implements ApiClient {
loggerService.logInfo("------Payload------"); loggerService.logInfo("------Payload------");
loggerService.logInfo(jsonDecode(requestBody).toString()); loggerService.logInfo(jsonDecode(requestBody).toString());
loggerService.logInfo("------Response------"); loggerService.logInfo("------Response------");
loggerService.logInfo(jsonDecode(response.body).toString()); log(jsonDecode(response.body).toString());
// loggerService.logInfo(jsonDecode(response.body).toString());
} }
if (response.statusCode >= 200 && response.statusCode < 500) { if (response.statusCode >= 200 && response.statusCode < 500) {
var jsonData = jsonDecode(response.body); var jsonData = jsonDecode(response.body);

@ -157,6 +157,7 @@ class AppAssets {
static String newVitalSignIcon = "assets/images/vitalsign_icon.svg"; static String newVitalSignIcon = "assets/images/vitalsign_icon.svg";
static String newDoctorIcon = "assets/images/doctor_icon.svg"; static String newDoctorIcon = "assets/images/doctor_icon.svg";
static String textBgLeaf = "assets/new_design_icons/text_bg_leaf.svg"; static String textBgLeaf = "assets/new_design_icons/text_bg_leaf.svg";
static String labIcon = "assets/new_design_icons/lab_icon.svg";
} }
class AppConstants { class AppConstants {
@ -169,6 +170,7 @@ class AppConstants {
static int thresholdForListUI = 5; static int thresholdForListUI = 5;
static double currentBuildVersion = 9.2; static double currentBuildVersion = 9.2;
static double clearLogsHoursThreshold = 48; static double clearLogsHoursThreshold = 48;
// Maximum log file size in bytes before rotation/clearing. Default 2 MB. // Maximum log file size in bytes before rotation/clearing. Default 2 MB.
static int maxLogFileSizeBytes = 2 * 1024 * 1024; static int maxLogFileSizeBytes = 2 * 1024 * 1024;
} }
@ -178,7 +180,8 @@ class ApiConstants {
static String baseUrlUat = 'https://ms.hmg.com/nscapi'; // UAT static String baseUrlUat = 'https://ms.hmg.com/nscapi'; // UAT
static String baseUrlDev = 'https://ms.hmg.com/nscapi2'; // DEV static String baseUrlDev = 'https://ms.hmg.com/nscapi2'; // DEV
static String baseUrl = baseUrlLive; // static String baseUrl = baseUrlLive;
static String baseUrl = baseUrlDev;
static String baseUrlHub = '$baseUrl/PatientCallingHub'; static String baseUrlHub = '$baseUrl/PatientCallingHub';
static String baseUrlApi = '$baseUrl/api'; static String baseUrlApi = '$baseUrl/api';
static String baseUrlApiGen = '$baseUrl/api/Gen'; static String baseUrlApiGen = '$baseUrl/api/Gen';
@ -235,13 +238,7 @@ class MockJsonRepo {
static TicketData ticket = TicketData( static TicketData ticket = TicketData(
id: 189805, id: 189805,
patientID: 4292695, patientID: 4292695,
laBQGroupID: null,
queueNo: 'W-T-4', queueNo: 'W-T-4',
counterBatchNo: null,
calledBy: null,
calledOn: null,
servedOn: null,
patientName: null,
mobileNo: '0598544522', mobileNo: '0598544522',
patientEmail: 'munira.ali@hotmail.com', patientEmail: 'munira.ali@hotmail.com',
preferredLang: 2, preferredLang: 2,
@ -250,12 +247,8 @@ class MockJsonRepo {
postVoiceText: 'Call for Vital Signs', postVoiceText: 'Call for Vital Signs',
patientGender: 2, patientGender: 2,
roomNo: 'D 12', roomNo: 'D 12',
isActive: null,
createdBy: null,
editedBy: null,
editedOn: DateTime.parse('2025-08-18 15:09:03.633'), editedOn: DateTime.parse('2025-08-18 15:09:03.633'),
createdOn: DateTime.parse('2025-08-18 15:06:07.363'), createdOn: DateTime.parse('2025-08-18 15:06:07.363'),
doctorNameN: null,
callTypeEnum: CallTypeEnum.doctor, callTypeEnum: CallTypeEnum.doctor,
queueNoM: 'W-T-4', queueNoM: 'W-T-4',
callNoStr: 'W_T-4', callNoStr: 'W_T-4',
@ -265,7 +258,6 @@ class MockJsonRepo {
orientationType: 0, orientationType: 0,
isTurnOn: false, isTurnOn: false,
concurrentCallDelaySec: 0, concurrentCallDelaySec: 0,
crTypeAckIP: null,
voiceLanguageText: 'English', voiceLanguageText: 'English',
vitalSignText: 'علامة حيوية', vitalSignText: 'علامة حيوية',
doctorText: 'الطبيب', doctorText: 'الطبيب',

@ -43,9 +43,13 @@ class MyApp extends StatelessWidget {
return LayoutBuilder( return LayoutBuilder(
builder: (context, constraints) { builder: (context, constraints) {
return OrientationBuilder(builder: (context, orientation) { return OrientationBuilder(builder: (context, orientation) {
log("orientationorientation: ${orientation.toString()}");
SizeConfig().init(constraints, orientation); SizeConfig().init(constraints, orientation);
SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky); SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
log("orientationorientation: ${orientation.toString()}");
return MultiProvider( return MultiProvider(
providers: [ providers: [
ChangeNotifierProvider<ScreenConfigViewModel>( ChangeNotifierProvider<ScreenConfigViewModel>(

@ -25,7 +25,8 @@ class GlobalConfigurationsModel {
int? priorityWhatsApp; int? priorityWhatsApp;
int? priorityEmail; int? priorityEmail;
String ticketNoText = "Ticket Number"; String ticketNoText = "Ticket Number";
String postVoiceText = "Please Visit Counter"; String pleaseVisitCounterTextEn = "Please Visit Counter";
String pleaseVisitCounterTextAr = "Please Visit Counter";
int? roomNo; int? roomNo;
bool? isRoomNoRequired; bool? isRoomNoRequired;
@ -37,12 +38,12 @@ class GlobalConfigurationsModel {
String? counterTextArb; String? counterTextArb;
String? queueNoTextArb; String? queueNoTextArb;
String? callForTextArb; String? callForTextArb;
String? currentServeTextEng; String? currentServeTextEng = "Current Serving";
String? currentServeTextArb; String? currentServeTextArb;
String maxText = ""; String maxText = "";
String minText = ""; String minText = "";
String nextPrayerTextEng = "Next Prayer"; String nextPrayerTextEng = "Next Prayer";
String nextPrayerTextArb = "الصلا<EFBFBD><EFBFBD> القادمة"; String nextPrayerTextArb = "الصلاة القادمة";
String weatherText = "Weather"; String weatherText = "Weather";
String? fajarTextEng; String? fajarTextEng;
String? dhuhrTextEng; String? dhuhrTextEng;
@ -77,7 +78,6 @@ class GlobalConfigurationsModel {
List<KioskQueueModel>? kioskQueueList; List<KioskQueueModel>? kioskQueueList;
List<KioskLanguageConfigModel>? kioskLanguageConfigList; List<KioskLanguageConfigModel>? kioskLanguageConfigList;
// Indicates whether the screen belongs to Takhasusi main (based on its IP)
bool isFromTakhasusiMain = false; bool isFromTakhasusiMain = false;
String vitalSignTextEng = "Vital Sign"; String vitalSignTextEng = "Vital Sign";
@ -102,6 +102,12 @@ class GlobalConfigurationsModel {
String callForVaccinationTextArb = "الرجاء التوجّه إلى غرفة التطعيم"; String callForVaccinationTextArb = "الرجاء التوجّه إلى غرفة التطعيم";
String callForNebulizationTextArb = "الرجاء التوجّه إلى غرفة البخاخة"; String callForNebulizationTextArb = "الرجاء التوجّه إلى غرفة البخاخة";
static String defaultIfNullOrEmpty(dynamic value, String def) {
if (value == null) return def;
if (value is String && value.trim().isEmpty) return def;
return value.toString();
}
GlobalConfigurationsModel({ GlobalConfigurationsModel({
this.id, this.id,
this.configType, this.configType,
@ -122,7 +128,8 @@ class GlobalConfigurationsModel {
this.priorityWhatsApp, this.priorityWhatsApp,
this.priorityEmail, this.priorityEmail,
this.ticketNoText = "Ticket Number", this.ticketNoText = "Ticket Number",
this.postVoiceText = "Please Visit Counter", this.pleaseVisitCounterTextEn = "Please Visit Counter",
this.pleaseVisitCounterTextAr = "يرجى زيارة الكاونتر",
this.roomTextEng, this.roomTextEng,
this.roomNo, this.roomNo,
this.isRoomNoRequired = true, this.isRoomNoRequired = true,
@ -132,7 +139,7 @@ class GlobalConfigurationsModel {
this.counterTextArb, this.counterTextArb,
this.queueNoTextArb, this.queueNoTextArb,
this.callForTextArb, this.callForTextArb,
this.currentServeTextEng, this.currentServeTextEng = "Current Serving",
this.currentServeTextArb, this.currentServeTextArb,
this.maxText = "", this.maxText = "",
this.minText = "", this.minText = "",
@ -195,74 +202,73 @@ class GlobalConfigurationsModel {
}); });
GlobalConfigurationsModel.fromJson({required Map<String, dynamic> json, int qType = 1, int screenType = 1}) { GlobalConfigurationsModel.fromJson({required Map<String, dynamic> json, int qType = 1, int screenType = 1}) {
id = json['id']; id = json['id'] ?? 0;
configType = json['configType']; configType = json['configType'] ?? 0;
description = json['description']; description = defaultIfNullOrEmpty(json['description'], "");
counterStart = json['counterStart']; counterStart = json['counterStart'] ?? 0;
counterEnd = json['counterEnd']; counterEnd = json['counterEnd'] ?? 0;
concurrentCallDelaySec = json['concurrentCallDelaySec'] ?? 1; concurrentCallDelaySec = json['concurrentCallDelaySec'] ?? 1;
voiceType = json['voiceType']; voiceType = json['voiceType'] ?? 0;
voiceTypeText = json['voiceTypeText']; voiceTypeText = defaultIfNullOrEmpty(json['voiceTypeText'], "");
screenLanguageEnum = (json['screenLanguage'] as int).toLanguageEnum(); screenLanguageEnum = ((json['screenLanguage'] ?? 1) as int).toLanguageEnum();
screenLanguageText = json['screenLanguageText']; screenLanguageText = defaultIfNullOrEmpty(json['screenLanguageText'], "English");
// textDirection = json['textDirection'] == 2 ? TextDirection.rtl : TextDirection.ltr; textDirection = json['textDirection'] == 2 ? TextDirection.rtl : TextDirection.ltr;
textDirection = TextDirection.rtl; voiceLanguageEnum = ((json['voiceLanguage'] ?? 1) as int).toLanguageEnum();
voiceLanguageText = defaultIfNullOrEmpty(json['voiceLanguageText'], "English");
screenMaxDisplayPatients = json['screenMaxDisplayPatients'] ?? 16; screenMaxDisplayPatients = json['screenMaxDisplayPatients'] ?? 16;
// screenMaxDisplayPatients = 15; isNotiReq = json['isNotiReq'] ?? false;
voiceLanguageEnum = (json['voiceLanguage'] as int).toLanguageEnum(); prioritySMS = json['prioritySMS'] ?? 0;
voiceLanguageText = json['voiceLanguageText']; priorityWhatsApp = json['priorityWhatsApp'] ?? 0;
isNotiReq = json['isNotiReq']; priorityEmail = json['priorityEmail'] ?? 0;
prioritySMS = json['prioritySMS']; ticketNoText = defaultIfNullOrEmpty(json['ticketNoText'], "Ticket Number");
priorityWhatsApp = json['priorityWhatsApp']; pleaseVisitCounterTextEn = defaultIfNullOrEmpty(json['pleaseVisitCounterText'], "Please Visit Counter");
priorityEmail = json['priorityEmail']; pleaseVisitCounterTextAr = defaultIfNullOrEmpty(json['pleaseVisitCounterTextAr'], "يرجى زيارة الكاونتر");
ticketNoText = json['ticketNoText'] ?? "Ticket Number"; roomNo = json['roomNo'] ?? 0;
postVoiceText = json['pleaseVisitCounterText'] ?? "Please Visit Counter";
roomNo = json['roomNo'];
isRoomNoRequired = json['isRoomNoReq'] ?? true; isRoomNoRequired = json['isRoomNoReq'] ?? true;
queueNoTextEng = json['queueNoText']; queueNoTextEng = defaultIfNullOrEmpty(json['queueNoText'], "Queue Number");
callForTextEng = json['callForText']; callForTextEng = defaultIfNullOrEmpty(json['callForText'], "Please Proceed");
counterTextEng = json['counterText']; counterTextEng = defaultIfNullOrEmpty(json['counterText'], "Counter");
roomTextEng = json['roomText']; roomTextEng = defaultIfNullOrEmpty(json['roomText'], "Room");
queueNoTextArb = json['queueNoTextAr'] ?? "الرقم"; queueNoTextArb = defaultIfNullOrEmpty(json['queueNoTextAr'], "الرقم");
callForTextArb = json['callForTextAr'] ?? "التوجه إلى"; callForTextArb = defaultIfNullOrEmpty(json['callForTextAr'], "التوجه إلى");
counterTextArb = json['counterTextAr'] ?? ""; counterTextArb = defaultIfNullOrEmpty(json['counterTextAr'], "الكاونتر");
roomTextArb = json['roomTextAr'] ?? "الغرفة"; roomTextArb = defaultIfNullOrEmpty(json['roomTextAr'], "الغرفة");
currentServeTextEng = json['currentServeText']; currentServeTextEng = defaultIfNullOrEmpty(json['currentServeText'], "Current Serving");
currentServeTextArb = json['currentServeTextAr'] ?? "يتم خدمة"; currentServeTextArb = defaultIfNullOrEmpty(json['currentServeTextAr'], "يتم خدمة");
maxText = json['maxText'] ?? ""; maxText = defaultIfNullOrEmpty(json['maxText'], "");
minText = json['minText'] ?? ""; minText = defaultIfNullOrEmpty(json['minText'], "");
nextPrayerTextEng = json['nextPrayerText'] ?? "Next Prayer"; nextPrayerTextEng = defaultIfNullOrEmpty(json['nextPrayerText'], "Next Prayer");
nextPrayerTextArb = json['nextPrayerTextArb'] ?? "الصلاة القادمة"; nextPrayerTextArb = defaultIfNullOrEmpty(json['nextPrayerTextArb'], "الصلاة القادمة");
weatherText = json['weatherText'] ?? "Weather"; weatherText = defaultIfNullOrEmpty(json['weatherText'], "Weather");
fajarTextEng = json['fajarText']; fajarTextEng = defaultIfNullOrEmpty(json['fajarText'], "Fajr");
dhuhrTextEng = json['dhuhrText']; dhuhrTextEng = defaultIfNullOrEmpty(json['dhuhrText'], "Dhuhr");
asarTextEng = json['asarText']; asarTextEng = defaultIfNullOrEmpty(json['asarText'], "Asar");
maghribTextEng = json['maghribText']; maghribTextEng = defaultIfNullOrEmpty(json['maghribText'], "Maghrib");
ishaTextEng = json['ishaText']; ishaTextEng = defaultIfNullOrEmpty(json['ishaText'], "Isha");
fajarTextArb = json['fajarTextAr'] ?? AppStrings.prayersArray[0]; fajarTextArb = defaultIfNullOrEmpty(json['fajarTextAr'], AppStrings.prayersArray[0]);
dhuhrTextArb = json['dhuhrTextAr'] ?? AppStrings.prayersArray[1]; dhuhrTextArb = defaultIfNullOrEmpty(json['dhuhrTextAr'], AppStrings.prayersArray[1]);
asarTextArb = json['asarTextAr'] ?? AppStrings.prayersArray[2]; asarTextArb = defaultIfNullOrEmpty(json['asarTextAr'], AppStrings.prayersArray[2]);
maghribTextArb = json['maghribTextAr'] ?? AppStrings.prayersArray[3]; maghribTextArb = defaultIfNullOrEmpty(json['maghribTextAr'], AppStrings.prayersArray[3]);
ishaTextArb = json['ishaTextAr'] ?? AppStrings.prayersArray[4]; ishaTextArb = defaultIfNullOrEmpty(json['ishaTextAr'], AppStrings.prayersArray[4]);
isActive = json['isActive']; isActive = json['isActive'] ?? true;
createdBy = json['createdBy']; createdBy = json['createdBy'] ?? 0;
createdOn = json['createdOn']; createdOn = defaultIfNullOrEmpty(json['createdOn'], "");
editedBy = json['editedBy']; editedBy = json['editedBy'];
editedOn = json['editedOn']; editedOn = json['editedOn'];
isToneReq = json['isToneReq'] ?? false; isToneReq = json['isToneReq'] ?? false;
isVoiceReq = json['isVoiceReq'] ?? false; isVoiceReq = json['isVoiceReq'] ?? false;
orientationTypeEnum = ((json['orientationType'] ?? 1) as int).toScreenOrientationEnum(); orientationTypeEnum = ((json['orientationType'] ?? 1) as int).toScreenOrientationEnum();
isTurnOn = json['isTurnOn']; isTurnOn = json['isTurnOn'] ?? true;
waitingAreaType = json['waitingAreaType']; waitingAreaType = json['waitingAreaType'] ?? 0;
gender = json['gender']; gender = json['gender'] ?? 0;
isWeatherReq = json['isWeatherReq'] ?? false; isWeatherReq = json['isWeatherReq'] ?? false;
isPrayerTimeReq = json['isPrayerTimeReq'] ?? false; isPrayerTimeReq = json['isPrayerTimeReq'] ?? false;
isRssFeedReq = json['isRssFeedReq'] ?? false; isRssFeedReq = json['isRssFeedReq'] ?? false;
qTypeEnum = ((json['qType'] ?? qType) as int).toQTypeEnum(); qTypeEnum = ((json['qType'] ?? qType) as int).toQTypeEnum();
screenTypeEnum = ((json['screenType'] ?? screenType) as int).toScreenTypeEnum(); screenTypeEnum = ((json['screenType'] ?? screenType) as int).toScreenTypeEnum();
projectID = json['projectID']; projectID = json['projectID'] ?? 0;
projectLatitude = json['projectLatitude'] == 0 ? 0.0 : json['projectLatitude']; projectLatitude = json['projectLatitude']?.toDouble() ?? 0.0;
projectLongitude = json['projectLongitude'] == 0 ? 0.0 : json['projectLongitude']; projectLongitude = json['projectLongitude']?.toDouble() ?? 0.0;
cityKey = json['cityKey'] ?? 0; cityKey = json['cityKey'] ?? 0;
if (json['kioskQueue'] != null) { if (json['kioskQueue'] != null) {
kioskQueueList = List<KioskQueueModel>.from(json['kioskQueue'].map((kioskQueueJson) => KioskQueueModel.fromJson(kioskQueueJson))); kioskQueueList = List<KioskQueueModel>.from(json['kioskQueue'].map((kioskQueueJson) => KioskQueueModel.fromJson(kioskQueueJson)));
@ -274,33 +280,31 @@ class GlobalConfigurationsModel {
} else { } else {
kioskLanguageConfigList = []; kioskLanguageConfigList = [];
} }
// Default to false; actual value (based on device IP) is set in ViewModel after loading config
isFromTakhasusiMain = false; isFromTakhasusiMain = false;
vitalSignTextEng = json['vitalSignText']; vitalSignTextEng = defaultIfNullOrEmpty(json['vitalSignText'], "Vital Sign");
doctorTextEng = json['doctorText']; doctorTextEng = defaultIfNullOrEmpty(json['doctorText'], "Doctor");
procedureTextEng = json['procedureText']; procedureTextEng = defaultIfNullOrEmpty(json['procedureText'], "Procedure");
vaccinationTextEng = json['vaccinationText']; vaccinationTextEng = defaultIfNullOrEmpty(json['vaccinationText'], "Vaccination");
nebulizationTextEng = json['nebulizationText']; nebulizationTextEng = defaultIfNullOrEmpty(json['nebulizationText'], "Nebulization");
callForVitalSignTextEng = json['callForVitalSignText']; callForVitalSignTextEng = defaultIfNullOrEmpty(json['callForVitalSignText'], "Call for Vital Sign");
callForDoctorTextEng = json['callForDoctorText']; callForDoctorTextEng = defaultIfNullOrEmpty(json['callForDoctorText'], "Call for Doctor");
callForProcedureTextEng = json['callForProcedureText']; callForProcedureTextEng = defaultIfNullOrEmpty(json['callForProcedureText'], "Call for Procedure");
callForVaccinationTextEng = json['callForVaccinationText']; callForVaccinationTextEng = defaultIfNullOrEmpty(json['callForVaccinationText'], "Call for Vaccination");
callForNebulizationTextEng = json['callForNebulizationText']; callForNebulizationTextEng = defaultIfNullOrEmpty(json['callForNebulizationText'], "Call for Nebulization");
vitalSignTextArb = defaultIfNullOrEmpty(json['vitalSignTextAr'], "العلامات الحيوية");
vitalSignTextArb = json['vitalSignTextAr'] ?? "غرفة العلامات الحيوية"; doctorTextArb = defaultIfNullOrEmpty(json['doctorTextAr'], "الطبيب");
doctorTextArb = json['doctorTextAr'] ?? " غرفة الطبيب"; procedureTextArb = defaultIfNullOrEmpty(json['procedureTextAr'], "الإجراء");
procedureTextArb = json['procedureTextAr'] ?? "غرفة الإجراء"; vaccinationTextArb = defaultIfNullOrEmpty(json['vaccinationTextAr'], "التطعيم");
vaccinationTextArb = json['vaccinationTextAr'] ?? "غرفة التطعيم"; nebulizationTextArb = defaultIfNullOrEmpty(json['nebulizationTextAr'], "البخاخة");
nebulizationTextArb = json['nebulizationTextAr'] ?? "غرفة البخاخة"; callForVitalSignTextArb = defaultIfNullOrEmpty(json['callForVitalSignTextAr'], "الرجاء التوجّه إلى غرفة العلامات الحيوية");
callForVitalSignTextArb = json['callForVitalSignTextAr'] ?? " غرفة استدعاء للعلامات الحيوية"; callForDoctorTextArb = defaultIfNullOrEmpty(json['callForDoctorTextAr'], "الرجاء التوجّه إلى غرفة الطبيب");
callForDoctorTextArb = json['callForDoctorTextAr'] ?? "الرجاء التوجّه إلى غرفة الطبيب"; callForProcedureTextArb = defaultIfNullOrEmpty(json['callForProcedureTextAr'], "الرجاء التوجّه إلى غرفة الإجراء");
callForProcedureTextArb = json['callForProcedureTextAr'] ?? "الرجاء التوجّه إلى غرفة الإجراء"; callForVaccinationTextArb = defaultIfNullOrEmpty(json['callForVaccinationTextAr'], "الرجاء التوجّه إلى غرفة التطعيم");
callForVaccinationTextArb = json['callForVaccinationTextAr'] ?? "الرجاء لتوجّه إلى غرفة التطعيم"; callForNebulizationTextArb = defaultIfNullOrEmpty(json['callForNebulizationTextAr'], "الرجاء التوجّه إلى غرفة البخاخة");
callForNebulizationTextArb = json['callForNebulizationTextAr'] ?? "الرجاء التوجّه إلى غرفة البخاخة";
} }
@override @override
String toString() { String toString() {
return 'GlobalConfigurationsModel{id: $id, isFromTakhasusiMain: $isFromTakhasusiMain, configType: $configType, description: $description, counterStart: $counterStart, counterEnd: $counterEnd, concurrentCallDelaySec: $concurrentCallDelaySec, voiceType: $voiceType, voiceTypeText: $voiceTypeText, screenLanguageEnum: $screenLanguageEnum, screenLanguageText: $screenLanguageText, textDirection: $textDirection, voiceLanguageEnum: $voiceLanguageEnum, voiceLanguageText: $voiceLanguageText, screenMaxDisplayPatients: $screenMaxDisplayPatients, isNotiReq: $isNotiReq, prioritySMS: $prioritySMS, priorityWhatsApp: $priorityWhatsApp, priorityEmail: $priorityEmail, ticketNoText: $ticketNoText, postVoiceText: $postVoiceText, roomText: $roomTextEng, roomNo: $roomNo, isRoomNoRequired: $isRoomNoRequired, counterText: $counterTextEng, queueNoText: $queueNoTextEng, callForText: $callForTextEng, currentServeTextArb: $currentServeTextArb,, currentServeTextEng: $currentServeTextEng, maxText: $maxText, minText: $minText, nextPrayerTextEng: $nextPrayerTextEng, nextPrayerTextArb: $nextPrayerTextArb, weatherText: $weatherText, fajarText: $fajarTextEng, dhuhrText: $dhuhrTextEng, asarText: $asarTextEng, maghribText: $maghribTextEng, ishaText: $ishaTextEng, isActive: $isActive, createdBy: $createdBy, createdOn: $createdOn, editedBy: $editedBy, editedOn: $editedOn, isToneReq: $isToneReq, isVoiceReq: $isVoiceReq, orientationTypeEnum: $orientationTypeEnum, isTurnOn: $isTurnOn, waitingAreaType: $waitingAreaType, gender: $gender, isWeatherReq: $isWeatherReq, isPrayerTimeReq: $isPrayerTimeReq, isRssFeedReq: $isRssFeedReq, qTypeEnum: $qTypeEnum, screenTypeEnum: $screenTypeEnum, projectID: $projectID, projectLatitude: $projectLatitude, projectLongitude: $projectLongitude, cityKey: $cityKey, kioskQueueList: $kioskQueueList, kioskLanguageConfigList: $kioskLanguageConfigList, vitalSignText: $vitalSignTextEng, doctorText: $doctorTextEng, procedureText: $procedureTextEng, vaccinationText: $vaccinationTextEng, nebulizationText: $nebulizationTextEng, callForVitalSignText: $callForVitalSignTextEng, callForDoctorText: $callForDoctorTextEng, callForProcedureText: $callForProcedureTextEng, callForVaccinationText: $callForVaccinationTextEng, callForNebulizationText: $callForNebulizationTextEng, vitalSignTextArb: $vitalSignTextArb, doctorTextArb: $doctorTextArb, procedureTextArb: $procedureTextArb, vaccinationTextArb: $vaccinationTextArb, nebulizationTextArb: $nebulizationTextArb, callForVitalSignTextArb: $callForVitalSignTextArb, callForDoctorTextArb: $callForDoctorTextArb, callForProcedureTextArb: $callForProcedureTextArb, callForVaccinationTextArb: $callForVaccinationTextArb, callForNebulizationTextArb: $callForNebulizationTextArb}'; return 'GlobalConfigurationsModel{id: $id, isFromTakhasusiMain: $isFromTakhasusiMain, configType: $configType, description: $description, counterStart: $counterStart, counterEnd: $counterEnd, concurrentCallDelaySec: $concurrentCallDelaySec, voiceType: $voiceType, voiceTypeText: $voiceTypeText, screenLanguageEnum: $screenLanguageEnum, screenLanguageText: $screenLanguageText, textDirection: $textDirection, voiceLanguageEnum: $voiceLanguageEnum, voiceLanguageText: $voiceLanguageText, screenMaxDisplayPatients: $screenMaxDisplayPatients, isNotiReq: $isNotiReq, prioritySMS: $prioritySMS, priorityWhatsApp: $priorityWhatsApp, priorityEmail: $priorityEmail, ticketNoText: $ticketNoText, pleaseVisitCounterTextEn: $pleaseVisitCounterTextEn,pleaseVisitCounterTextAr: $pleaseVisitCounterTextAr, roomText: $roomTextEng, roomNo: $roomNo, isRoomNoRequired: $isRoomNoRequired, counterText: $counterTextEng, queueNoText: $queueNoTextEng, callForText: $callForTextEng, currentServeTextArb: $currentServeTextArb,, currentServeTextEng: $currentServeTextEng, maxText: $maxText, minText: $minText, nextPrayerTextEng: $nextPrayerTextEng, nextPrayerTextArb: $nextPrayerTextArb, weatherText: $weatherText, fajarText: $fajarTextEng, dhuhrText: $dhuhrTextEng, asarText: $asarTextEng, maghribText: $maghribTextEng, ishaText: $ishaTextEng, isActive: $isActive, createdBy: $createdBy, createdOn: $createdOn, editedBy: $editedBy, editedOn: $editedOn, isToneReq: $isToneReq, isVoiceReq: $isVoiceReq, orientationTypeEnum: $orientationTypeEnum, isTurnOn: $isTurnOn, waitingAreaType: $waitingAreaType, gender: $gender, isWeatherReq: $isWeatherReq, isPrayerTimeReq: $isPrayerTimeReq, isRssFeedReq: $isRssFeedReq, qTypeEnum: $qTypeEnum, screenTypeEnum: $screenTypeEnum, projectID: $projectID, projectLatitude: $projectLatitude, projectLongitude: $projectLongitude, cityKey: $cityKey, kioskQueueList: $kioskQueueList, kioskLanguageConfigList: $kioskLanguageConfigList, vitalSignText: $vitalSignTextEng, doctorText: $doctorTextEng, procedureText: $procedureTextEng, vaccinationText: $vaccinationTextEng, nebulizationText: $nebulizationTextEng, callForVitalSignText: $callForVitalSignTextEng, callForDoctorText: $callForDoctorTextEng, callForProcedureText: $callForProcedureTextEng, callForVaccinationText: $callForVaccinationTextEng, callForNebulizationText: $callForNebulizationTextEng, vitalSignTextArb: $vitalSignTextArb, doctorTextArb: $doctorTextArb, procedureTextArb: $procedureTextArb, vaccinationTextArb: $vaccinationTextArb, nebulizationTextArb: $nebulizationTextArb, callForVitalSignTextArb: $callForVitalSignTextArb, callForDoctorTextArb: $callForDoctorTextArb, callForProcedureTextArb: $callForProcedureTextArb, callForVaccinationTextArb: $callForVaccinationTextArb, callForNebulizationTextArb: $callForNebulizationTextArb}';
} }
} }

@ -11,104 +11,105 @@ class TicketDetailsModel {
TicketDetailsModel({this.qTypeEnum, this.screenTypeEnum, this.connectionID, this.ticketModel}); TicketDetailsModel({this.qTypeEnum, this.screenTypeEnum, this.connectionID, this.ticketModel});
TicketDetailsModel.fromJson(Map<String, dynamic> json) { TicketDetailsModel.fromJson(Map<String, dynamic> json) {
qTypeEnum = json['qType'] != null ? (json['qType'] as int).toQTypeEnum() : null; qTypeEnum = json['qType'] != null ? (json['qType'] as int).toQTypeEnum() : QTypeEnum.appointment;
screenTypeEnum = json['screenType'] != null ? (json['screenType'] as int).toScreenTypeEnum() : null; screenTypeEnum = json['screenType'] != null ? (json['screenType'] as int).toScreenTypeEnum() : ScreenTypeEnum.waitingAreaScreen;
connectionID = json['connectionID']; connectionID = json['connectionID'] ?? '';
ticketModel = json['data'] != null ticketModel = json['data'] != null
? TicketData.fromJson( ? TicketData.fromJson(
json['data'], json['data'],
qTypeEnum: json['qType'] != null ? (json['qType'] as int).toQTypeEnum() : null, qTypeEnum: qTypeEnum,
) )
: null; : TicketData(); // Use default empty TicketData if null
} }
} }
class TicketData { class TicketData {
int? id; int id;
int? patientID; int patientID;
int? laBQGroupID; int laBQGroupID;
String? queueNo; String queueNo;
int? counterBatchNo; int counterBatchNo;
int? calledBy; int calledBy;
String? calledOn; String calledOn;
String? servedOn; String servedOn;
String? patientName; String patientName;
String? mobileNo; String mobileNo;
String? patientEmail; String patientEmail;
int? preferredLang; int preferredLang;
LanguageEnum voiceLanguageEnum = LanguageEnum.english; LanguageEnum voiceLanguageEnum;
String ticketNoText = "Ticket Number"; String ticketNoText;
String postVoiceText = "Please Visit Counter"; String postVoiceText;
int? patientGender; int patientGender;
String? roomNo; String roomNo;
bool? isActive; bool isActive;
int? createdBy; int createdBy;
int? editedBy; int editedBy;
DateTime? editedOn; DateTime? editedOn;
DateTime? createdOn; DateTime? createdOn;
// New fields // New fields
String? doctorNameN; String doctorNameN;
CallTypeEnum callTypeEnum = CallTypeEnum.vitalSign; CallTypeEnum callTypeEnum;
String? queueNoM; String queueNoM;
String? callNoStr; String callNoStr;
bool? isQueue; bool isQueue;
bool? isToneReq; bool isToneReq;
bool? isVoiceReq; bool isVoiceReq;
int? orientationType; int orientationType;
bool? isTurnOn; bool isTurnOn;
int? concurrentCallDelaySec; int concurrentCallDelaySec;
String? crTypeAckIP; String crTypeAckIP;
int voiceLanguage = 1; int voiceLanguage;
String voiceLanguageText = "English"; String voiceLanguageText;
String vitalSignText = "Vital Sign"; String vitalSignText;
String doctorText = "Doctor"; String doctorText;
String procedureText = "Procedure"; String procedureText;
String vaccinationText = "Vaccination"; String vaccinationText;
String nebulizationText = "Nebulization"; String nebulizationText;
String callForVitalSignText = "Call for Vital Sign"; String callForVitalSignText;
String callForDoctorText = "Call for Doctor"; String callForDoctorText;
String callForProcedureText = "Call for Procedure"; String callForProcedureText;
String callForVaccinationText = "Call for Vaccination"; String callForVaccinationText;
String callForNebulizationText = "Call for Nebulization"; String callForNebulizationText;
String roomText = "Room"; String roomText;
String queueNoText = "Counter"; String queueNoText;
String callForText = "Call For"; String callForText;
TicketData({ TicketData({
this.id, this.id = 0,
this.patientID, this.patientID = 0,
this.laBQGroupID, this.laBQGroupID = 0,
this.queueNo, this.queueNo = "",
this.counterBatchNo, this.counterBatchNo = 0,
this.calledBy, this.calledBy = 0,
this.calledOn, this.calledOn = "",
this.servedOn, this.servedOn = "",
this.patientName, this.patientName = "",
this.mobileNo, this.mobileNo = "",
this.patientEmail, this.patientEmail = "",
this.preferredLang, this.preferredLang = 1,
this.voiceLanguageEnum = LanguageEnum.english, this.voiceLanguageEnum = LanguageEnum.english,
this.ticketNoText = "Ticket Number", this.ticketNoText = "Ticket Number",
this.postVoiceText = "Please Visit Counter", this.postVoiceText = "Please Visit Counter",
this.patientGender, this.patientGender = 1,
this.roomNo, this.roomNo = "",
this.isActive, this.isActive = true,
this.createdBy, this.createdBy = 0,
this.createdOn, this.createdOn, // will fallback in fromJson (see below)
this.editedBy, this.editedBy = 0,
this.editedOn, this.editedOn, // will fallback in fromJson (see below)
this.doctorNameN, this.doctorNameN = "",
this.callTypeEnum = CallTypeEnum.vitalSign, this.callTypeEnum = CallTypeEnum.none,
this.queueNoM, this.queueNoM = "",
this.callNoStr, this.callNoStr = "",
this.isQueue, this.isQueue = false,
this.isToneReq, this.isToneReq = false,
this.isVoiceReq, this.isVoiceReq = false,
this.orientationType, this.orientationType = 1,
this.isTurnOn, this.isTurnOn = true,
this.concurrentCallDelaySec, this.concurrentCallDelaySec = 1,
this.crTypeAckIP, this.crTypeAckIP = "",
this.voiceLanguage = 1,
this.voiceLanguageText = "English", this.voiceLanguageText = "English",
this.vitalSignText = "Vital Sign", this.vitalSignText = "Vital Sign",
this.doctorText = "Doctor", this.doctorText = "Doctor",
@ -125,63 +126,61 @@ class TicketData {
this.callForText = "Call For", this.callForText = "Call For",
}); });
TicketData.fromJson(Map<String, dynamic> json, {QTypeEnum? qTypeEnum}) { TicketData.fromJson(Map<String, dynamic> json, {QTypeEnum? qTypeEnum})
id = json['id']; : id = json['id'] ?? 0,
patientID = json['patientID']; patientID = json['patientID'] ?? 0,
laBQGroupID = json['laB_QGroupID']; laBQGroupID = json['laB_QGroupID'] ?? 0,
queueNo = json['queueNoM']; queueNo = json['queueNo'] ?? "",
counterBatchNo = json['counterBatchNo']; counterBatchNo = json['counterBatchNo'] ?? 0,
calledBy = json['calledBy']; calledBy = json['calledBy'] ?? 0,
calledOn = json['calledOn']; calledOn = json['calledOn'] ?? "",
servedOn = json['servedOn']; servedOn = json['servedOn'] ?? "",
patientName = json['patientName']; patientName = json['patientName'] ?? "",
mobileNo = json['mobileNo']; mobileNo = json['mobileNo'] ?? "",
patientEmail = json['patientEmail']; patientEmail = json['patientEmail'] ?? "",
preferredLang = (json['preferredLang'] != null && json['preferredLang'].toString().trim() != "") ? int.parse(json['preferredLang'].toString()) : 1; preferredLang = (json['preferredLang'] != null && json['preferredLang'].toString().trim() != "") ? int.parse(json['preferredLang'].toString()) : 1,
voiceLanguageEnum = (json['preferredLang'] != null && json['preferredLang'].toString().trim() != "") ? (int.parse(json['preferredLang'].toString())).toLanguageEnum() : LanguageEnum.english; voiceLanguageEnum = (json['preferredLang'] != null && json['preferredLang'].toString().trim() != "") ? (int.parse(json['preferredLang'].toString())).toLanguageEnum() : LanguageEnum.english,
ticketNoText = json['ticketNoText'] ?? "Ticket Number"; ticketNoText = json['ticketNoText'] ?? "Ticket Number",
postVoiceText = json['pleaseVisitCounterText'] ?? "Please Visit Counter"; postVoiceText = json['pleaseVisitCounterText'] ?? "Please Visit Counter",
patientGender = json['patientGender'] ?? 1; patientGender = json['patientGender'] ?? 1,
roomNo = json['roomNo']?.toString(); roomNo = (() {
if (qTypeEnum != null && qTypeEnum == QTypeEnum.general) { if (qTypeEnum != null && qTypeEnum == QTypeEnum.general) {
roomNo = json['counterNo']?.toString(); return json['counterNo']?.toString() ?? "";
} }
isActive = json['isActive']; return json['roomNo']?.toString() ?? "";
createdBy = json['createdBy']; })(),
editedBy = json['editedBy']; isActive = json['isActive'] ?? true,
editedOn = json['editedOn'] != null ? (json['editedOn'] as String).toDateTime() : DateTime.now(); createdBy = json['createdBy'] ?? 0,
createdOn = json['createdOn'] != null ? (json['createdOn'] as String).toDateTime() : DateTime.now(); editedBy = json['editedBy'] ?? 0,
createdOn = json['createdOn'] != null ? (json['createdOn'] as String).toDateTime() : DateTime.now(),
doctorNameN = json['doctorNameN']; editedOn = json['editedOn'] != null ? (json['editedOn'] as String).toDateTime() : DateTime.now(),
callTypeEnum = ((json['callType'] ?? 1) as int).toCallTypeEnum(); doctorNameN = json['doctorNameN'] ?? "",
queueNoM = json['queueNoM']; callTypeEnum = ((json['callType'] ?? 0) as int).toCallTypeEnum(),
callNoStr = json['callNoStr']; queueNoM = json['queueNoM'] ?? "",
isQueue = json['isQueue']; callNoStr = json['callNoStr'] ?? "",
isToneReq = json['isToneReq']; isQueue = json['isQueue'] ?? false,
isVoiceReq = json['isVoiceReq']; isToneReq = json['isToneReq'] ?? false,
orientationType = json['orientationType']; isVoiceReq = json['isVoiceReq'] ?? false,
isTurnOn = json['isTurnOn']; orientationType = json['orientationType'] ?? 1,
concurrentCallDelaySec = json['concurrentCallDelaySec']; isTurnOn = json['isTurnOn'] ?? true,
crTypeAckIP = json['crTypeAckIP']; concurrentCallDelaySec = json['concurrentCallDelaySec'] ?? 1,
voiceLanguage = json['voiceLanguage'] ?? 1; crTypeAckIP = json['crTypeAckIP'] ?? "",
voiceLanguageText = json['voiceLanguageText'] ?? "English"; voiceLanguage = json['voiceLanguage'] ?? 1,
vitalSignText = json['vitalSignText']; voiceLanguageText = json['voiceLanguageText'] ?? "English",
doctorText = json['doctorText']; vitalSignText = json['vitalSignText'] ?? "Vital Sign",
procedureText = json['procedureText']; doctorText = json['doctorText'] ?? "Doctor",
vaccinationText = json['vaccinationText']; procedureText = json['procedureText'] ?? "Procedure",
nebulizationText = json['nebulizationText']; vaccinationText = json['vaccinationText'] ?? "Vaccination",
callForVitalSignText = json['callForVitalSignText']; nebulizationText = json['nebulizationText'] ?? "Nebulization",
callForDoctorText = json['callForDoctorText']; callForVitalSignText = json['callForVitalSignText'] ?? "Call for Vital Sign",
callForProcedureText = json['callForProcedureText']; callForDoctorText = json['callForDoctorText'] ?? "Call for Doctor",
callForVaccinationText = json['callForVaccinationText']; callForProcedureText = json['callForProcedureText'] ?? "Call for Procedure",
callForNebulizationText = json['callForNebulizationText']; callForVaccinationText = json['callForVaccinationText'] ?? "Call for Vaccination",
roomText = json['roomText']; callForNebulizationText = json['callForNebulizationText'] ?? "Call for Nebulization",
queueNoText = json['queueNoText']; roomText = json['roomText'] ?? "Room",
callForText = json['callForText']; queueNoText = json['queueNoText'] ?? "Counter",
} callForText = json['callForText'] ?? "Call For";
@override @override
String toString() { String toString() => 'TicketData{id: $id, patientID: $patientID, laBQGroupID: $laBQGroupID, queueNo: $queueNo, ...}';
return 'TicketData{id: $id, patientID: $patientID, laBQGroupID: $laBQGroupID, queueNo: $queueNo, counterBatchNo: $counterBatchNo, calledBy: $calledBy, calledOn: $calledOn, servedOn: $servedOn, patientName: $patientName, mobileNo: $mobileNo, patientEmail: $patientEmail, preferredLang: $preferredLang, voiceLanguageEnum: $voiceLanguageEnum, ticketNoText: $ticketNoText, postVoiceText: $postVoiceText, patientGender: $patientGender, roomNo: $roomNo, isActive: $isActive, createdBy: $createdBy, editedBy: $editedBy, editedOn: $editedOn, createdOn: $createdOn, doctorNameN: $doctorNameN, callTypeEnum: $callTypeEnum, queueNoM: $queueNoM, callNoStr: $callNoStr, isQueue: $isQueue, isToneReq: $isToneReq, isVoiceReq: $isVoiceReq, orientationType: $orientationType, isTurnOn: $isTurnOn, concurrentCallDelaySec: $concurrentCallDelaySec, crTypeAckIP: $crTypeAckIP, voiceLanguage: $voiceLanguage, voiceLanguageText: $voiceLanguageText, vitalSignText: $vitalSignText, doctorText: $doctorText, procedureText: $procedureText, vaccinationText: $vaccinationText, nebulizationText: $nebulizationText, callForVitalSignText: $callForVitalSignText, callForDoctorText: $callForDoctorText, callForProcedureText: $callForProcedureText, callForVaccinationText: $callForVaccinationText, callForNebulizationText: $callForNebulizationText, roomText: $roomText, queueNoText: $queueNoText, callForText: $callForText}';
}
} }

@ -95,7 +95,7 @@ class LoggerServiceImp implements LoggerService {
try { try {
ScreenConfigViewModel screenConfigViewModel = getIt.get<ScreenConfigViewModel>(); ScreenConfigViewModel screenConfigViewModel = getIt.get<ScreenConfigViewModel>();
final timestamp = DateFormat('yyyy-MM-dd hh:mm:ss a').format(DateTime.now()); final timestamp = DateFormat('yyyy-MM-dd hh:mm:ss a').format(DateTime.now());
final sep = '==================== CRASH ===================='; const sep = '==================== CRASH ====================';
final contextStr = context ?? 'No context provided'; final contextStr = context ?? 'No context provided';
final errorMsg = error.toString(); final errorMsg = error.toString();
final stack = stackTrace?.toString() ?? 'No stack trace available'; final stack = stackTrace?.toString() ?? 'No stack trace available';

@ -166,6 +166,7 @@ extension LanguageEnumToString on LanguageEnum {
extension XCallType on CallTypeEnum { extension XCallType on CallTypeEnum {
Color getColorByCallType() { Color getColorByCallType() {
log("getColorByCallType: $this");
if (this == CallTypeEnum.vitalSign) { if (this == CallTypeEnum.vitalSign) {
return AppColors.newVitalSignColor; return AppColors.newVitalSignColor;
} else if (this == CallTypeEnum.doctor) { } else if (this == CallTypeEnum.doctor) {
@ -176,9 +177,10 @@ extension XCallType on CallTypeEnum {
return AppColors.vaccinationColor; return AppColors.vaccinationColor;
} else if (this == CallTypeEnum.nebulization) { } else if (this == CallTypeEnum.nebulization) {
return AppColors.nebulizationColor; return AppColors.nebulizationColor;
} else { } else if (this == CallTypeEnum.none) {
return Colors.black54; return AppColors.newDoctorColor;
} }
return AppColors.newDoctorColor;
} }
String getMessageByCallTypeForEnglish(GlobalConfigurationsModel globalConfig, {bool isListView = false}) { String getMessageByCallTypeForEnglish(GlobalConfigurationsModel globalConfig, {bool isListView = false}) {
@ -194,7 +196,7 @@ extension XCallType on CallTypeEnum {
case CallTypeEnum.nebulization: case CallTypeEnum.nebulization:
return !isListView ? globalConfig.callForNebulizationTextEng : globalConfig.nebulizationTextEng; return !isListView ? globalConfig.callForNebulizationTextEng : globalConfig.nebulizationTextEng;
case CallTypeEnum.none: case CallTypeEnum.none:
return !isListView ? globalConfig.callForVitalSignTextEng : globalConfig.vitalSignTextEng; return !isListView ? (globalConfig.pleaseVisitCounterTextEn ?? '') : (globalConfig.counterTextEng ?? '');
} }
} }
@ -211,11 +213,15 @@ extension XCallType on CallTypeEnum {
case CallTypeEnum.nebulization: case CallTypeEnum.nebulization:
return !isListView ? globalConfig.callForNebulizationTextArb : globalConfig.nebulizationTextArb; return !isListView ? globalConfig.callForNebulizationTextArb : globalConfig.nebulizationTextArb;
case CallTypeEnum.none: case CallTypeEnum.none:
return !isListView ? globalConfig.callForVitalSignTextArb : globalConfig.vitalSignTextArb; return !isListView ? (globalConfig.pleaseVisitCounterTextAr ?? '') : (globalConfig.counterTextArb ?? '');
} }
} }
SvgPicture getIconByCallType(double height, {double? width, BoxFit fit = BoxFit.contain}) { Widget getIconByCallType(double height, QTypeEnum qType, {double? width, BoxFit fit = BoxFit.contain}) {
if (this == CallTypeEnum.vitalSign) {
return const SizedBox.shrink();
}
String iconPath = ""; String iconPath = "";
if (this == CallTypeEnum.vitalSign) { if (this == CallTypeEnum.vitalSign) {
iconPath = AppAssets.newVitalSignIcon; iconPath = AppAssets.newVitalSignIcon;
@ -229,6 +235,10 @@ extension XCallType on CallTypeEnum {
iconPath = AppAssets.nebulizationIcon; iconPath = AppAssets.nebulizationIcon;
} }
if (qType == QTypeEnum.lab) {
iconPath = AppAssets.labIcon;
}
return SvgPicture.asset( return SvgPicture.asset(
iconPath.isEmpty ? "assets/images/wait.svg" : iconPath, iconPath.isEmpty ? "assets/images/wait.svg" : iconPath,
height: height, height: height,
@ -251,7 +261,7 @@ extension XCallType on CallTypeEnum {
case CallTypeEnum.nebulization: case CallTypeEnum.nebulization:
return 5; return 5;
case CallTypeEnum.none: case CallTypeEnum.none:
return 1; return 0;
} }
} }
@ -268,7 +278,7 @@ extension XCallType on CallTypeEnum {
case CallTypeEnum.nebulization: case CallTypeEnum.nebulization:
return AppColors.gradientBorderComboForVitalSigns; return AppColors.gradientBorderComboForVitalSigns;
case CallTypeEnum.none: case CallTypeEnum.none:
return AppColors.gradientBorderComboForVitalSigns; return AppColors.gradientBorderComboForDoctor;
} }
} }
@ -284,8 +294,8 @@ extension XCallType on CallTypeEnum {
return ticket.callForVaccinationText; return ticket.callForVaccinationText;
case CallTypeEnum.nebulization: case CallTypeEnum.nebulization:
return ticket.callForNebulizationText; return ticket.callForNebulizationText;
default: case CallTypeEnum.none:
return ticket.callForVitalSignText; return '';
} }
} }
} }
@ -297,7 +307,7 @@ extension XCallTypeInt on int {
if (this == 3) return CallTypeEnum.procedure; if (this == 3) return CallTypeEnum.procedure;
if (this == 4) return CallTypeEnum.vaccination; if (this == 4) return CallTypeEnum.vaccination;
if (this == 5) return CallTypeEnum.nebulization; if (this == 5) return CallTypeEnum.nebulization;
return CallTypeEnum.vitalSign; return CallTypeEnum.none;
} }
} }

@ -215,7 +215,9 @@ class QueuingViewModel extends ChangeNotifier {
callTypeEnum: ticketData.callTypeEnum, callTypeEnum: ticketData.callTypeEnum,
); );
} else { } else {
screenConfigViewModel.acknowledgeTicket(ticketQueueID: ticketData.id ?? 0); screenConfigViewModel.acknowledgeTicket(ticketQueueID: ticketData.id ?? 0,
ipAddress: screenConfigViewModel.currentScreenIP,
);
} }
log("globalConfigurationsModel: ${globalConfigurationsModel.toString()}"); log("globalConfigurationsModel: ${globalConfigurationsModel.toString()}");

@ -477,9 +477,9 @@ class ScreenConfigViewModel extends ChangeNotifier {
} }
} }
Future<void> acknowledgeTicket({required int ticketQueueID}) async { Future<void> acknowledgeTicket({required int ticketQueueID, required String ipAddress}) async {
GenericRespModel? response = await screenDetailsRepo.acknowledgeTicket( GenericRespModel? response = await screenDetailsRepo.acknowledgeTicket(
ipAddress: currentScreenIP, ipAddress: ipAddress,
ticketQueueID: ticketQueueID, ticketQueueID: ticketQueueID,
qTypeEnum: globalConfigurationsModel.qTypeEnum, qTypeEnum: globalConfigurationsModel.qTypeEnum,
); );

@ -1,3 +1,5 @@
import 'dart:developer';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:hmg_qline/constants/app_constants.dart'; import 'package:hmg_qline/constants/app_constants.dart';
@ -128,7 +130,7 @@ Widget counterNoText({required int counterNo, required bool isRoomNoRequired, re
fontFamily: AppStrings.fontNamePoppins, fontFamily: AppStrings.fontNamePoppins,
textAlign: TextAlign.center, textAlign: TextAlign.center,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: isRoomNoRequired ? Colors.black : Colors.transparent, color: isRoomNoRequired ? AppColors.greyTextColor : Colors.transparent,
fontSize: SizeConfig.getWidthMultiplier() * 8, fontSize: SizeConfig.getWidthMultiplier() * 8,
); );
} }

@ -3,10 +3,12 @@ import 'package:flutter/material.dart';
import 'package:hmg_qline/models/global_config_model.dart'; import 'package:hmg_qline/models/global_config_model.dart';
import 'package:hmg_qline/models/ticket_model.dart'; import 'package:hmg_qline/models/ticket_model.dart';
import 'package:hmg_qline/utilities/enums.dart'; import 'package:hmg_qline/utilities/enums.dart';
import 'package:hmg_qline/view_models/screen_config_view_model.dart';
import 'package:hmg_qline/views/common_widgets/app_general_widgets.dart'; import 'package:hmg_qline/views/common_widgets/app_general_widgets.dart';
import 'package:hmg_qline/views/main_queue_screen/components/ticket_item_calling_card.dart'; import 'package:hmg_qline/views/main_queue_screen/components/ticket_item_calling_card.dart';
import 'package:hmg_qline/views/main_queue_screen/components/ticket_item_normal_card.dart'; import 'package:hmg_qline/views/main_queue_screen/components/ticket_item_normal_card.dart';
import 'package:hmg_qline/views/view_helpers/size_config.dart'; import 'package:hmg_qline/views/view_helpers/size_config.dart';
import 'package:provider/provider.dart';
class PriorityTickets extends StatelessWidget { class PriorityTickets extends StatelessWidget {
final List<TicketDetailsModel> tickets; final List<TicketDetailsModel> tickets;
@ -93,7 +95,10 @@ class PriorityTickets extends StatelessWidget {
} }
Widget _buildPrimaryTicket(BuildContext context, TicketDetailsModel ticket, {bool isFullWidth = false, bool isHalf = false}) { Widget _buildPrimaryTicket(BuildContext context, TicketDetailsModel ticket, {bool isFullWidth = false, bool isHalf = false}) {
final screenConfigViewModel = context.read<ScreenConfigViewModel>();
Widget primaryCallingCard = QueueItemCallingCard( Widget primaryCallingCard = QueueItemCallingCard(
qTypeEnum: screenConfigViewModel.currentQTypeEnum,
isGradientRequired: true, isGradientRequired: true,
isBorderRequired: true, isBorderRequired: true,
isSingleTicket: isFullWidth, isSingleTicket: isFullWidth,
@ -104,7 +109,7 @@ class PriorityTickets extends StatelessWidget {
roomText: _getRoomText(), roomText: _getRoomText(),
roomTextAr: _getRoomTextAr(), roomTextAr: _getRoomTextAr(),
isClinicAdded: false, isClinicAdded: false,
callTypeEnum: ticket.ticketModel?.callTypeEnum ?? CallTypeEnum.vitalSign, callTypeEnum: ticket.ticketModel?.callTypeEnum ?? CallTypeEnum.none,
textDirection: globalConfigurationsModel.textDirection, textDirection: globalConfigurationsModel.textDirection,
screenTypeEnum: globalConfigurationsModel.screenTypeEnum, screenTypeEnum: globalConfigurationsModel.screenTypeEnum,
langTypeEnum: globalConfigurationsModel.screenLanguageEnum, langTypeEnum: globalConfigurationsModel.screenLanguageEnum,
@ -131,7 +136,7 @@ class PriorityTickets extends StatelessWidget {
child: ConstrainedBox( child: ConstrainedBox(
constraints: BoxConstraints( constraints: BoxConstraints(
maxWidth: MediaQuery.of(context).size.width * 0.6, // 60% of screen width maxWidth: MediaQuery.of(context).size.width * 0.6, // 60% of screen width
minHeight: SizeConfig.getHeightMultiplier() * 2.5, // Minimum height minHeight: SizeConfig.getHeightMultiplier() * 2, // Minimum height
), ),
child: Transform.scale( child: Transform.scale(
scale: _getTicketScale() + 0.2, scale: _getTicketScale() + 0.2,
@ -145,13 +150,15 @@ class PriorityTickets extends StatelessWidget {
} }
Widget _buildSecondaryTicket(BuildContext context, TicketDetailsModel ticket, {EdgeInsets? margin, bool isHalf = false}) { Widget _buildSecondaryTicket(BuildContext context, TicketDetailsModel ticket, {EdgeInsets? margin, bool isHalf = false}) {
final screenConfigViewModel = context.read<ScreenConfigViewModel>();
Widget secondaryCallingCard = QueueItemNormalCard( Widget secondaryCallingCard = QueueItemNormalCard(
qTypeEnum: screenConfigViewModel.currentQTypeEnum,
ticketNo: ticket.ticketModel?.queueNo ?? '', ticketNo: ticket.ticketModel?.queueNo ?? '',
roomNo: ticket.ticketModel?.roomNo ?? '', roomNo: ticket.ticketModel?.roomNo ?? '',
roomText: _getRoomText(), roomText: _getRoomText(),
roomTextAr: _getRoomTextAr(), roomTextAr: _getRoomTextAr(),
isClinicAdded: false, isClinicAdded: false,
callTypeEnum: ticket.ticketModel?.callTypeEnum ?? CallTypeEnum.vitalSign, callTypeEnum: ticket.ticketModel?.callTypeEnum ?? CallTypeEnum.none,
textDirection: globalConfigurationsModel.textDirection, textDirection: globalConfigurationsModel.textDirection,
screenTypeEnum: globalConfigurationsModel.screenTypeEnum, screenTypeEnum: globalConfigurationsModel.screenTypeEnum,
langTypeEnum: globalConfigurationsModel.screenLanguageEnum, langTypeEnum: globalConfigurationsModel.screenLanguageEnum,
@ -187,7 +194,7 @@ class PriorityTickets extends StatelessWidget {
// Helper methods to reduce repetition // Helper methods to reduce repetition
double _getTicketScale() { double _getTicketScale() {
return globalConfigurationsModel.screenTypeEnum == ScreenTypeEnum.roomLevelScreen return globalConfigurationsModel.screenTypeEnum == ScreenTypeEnum.roomLevelScreen
? 2.0 ? 1.5
: globalConfigurationsModel.isFromTakhasusiMain : globalConfigurationsModel.isFromTakhasusiMain
? 0.8 ? 0.8
: 1.2; : 1.2;

@ -48,62 +48,62 @@ class PriorityTicketsWithSideSection extends StatelessWidget {
), ),
), ),
), ),
if (globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment) ...[ // if (globalConfigurationsModel.qTypeEnum == QTypeEnum.appointment) ...[
Expanded( Expanded(
flex: 8, flex: 8,
child: SizedBox( child: SizedBox(
height: SizeConfig.getHeightMultiplier() * 0.25, height: SizeConfig.getHeightMultiplier() * 0.25,
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Expanded( Expanded(
flex: 2, flex: 2,
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
ticketModel.callTypeEnum.getIconByCallType(SizeConfig.getHeightMultiplier() * 0.2), ticketModel.callTypeEnum.getIconByCallType(SizeConfig.getHeightMultiplier() * 0.2, globalConfigurationsModel.qTypeEnum),
], ],
),
), ),
Expanded( ),
flex: 9, Expanded(
child: Row( flex: 9,
mainAxisAlignment: MainAxisAlignment.start, child: Row(
children: [ mainAxisAlignment: MainAxisAlignment.start,
children: [
Expanded(
flex: 3,
child: AppText(
callMessageAr,
color: ticketModel.callTypeEnum.getColorByCallType(),
fontSize: SizeConfig.getWidthMultiplier() * 1.8,
fontWeight: FontWeight.bold,
fontFamily: AppStrings.fontNameGesTwo,
fontHeight: 1,
textOverflow: TextOverflow.clip,
maxLines: 1,
),
),
SizedBox(width: SizeConfig.getWidthMultiplier()),
if (callMessageEng.isNotEmpty) ...[
Expanded( Expanded(
flex: 3, flex: 2,
child: AppText( child: AppText(
callMessageAr, "($callMessageEng)",
color: ticketModel.callTypeEnum.getColorByCallType(), color: ticketModel.callTypeEnum.getColorByCallType(),
fontSize: SizeConfig.getWidthMultiplier() * 1.8, fontSize: SizeConfig.getWidthMultiplier() * 1.8,
fontWeight: FontWeight.bold, fontFamily: AppStrings.fontNamePoppins,
fontFamily: AppStrings.fontNameGesTwo,
fontHeight: 1, fontHeight: 1,
textOverflow: TextOverflow.clip,
maxLines: 1,
), ),
), ),
SizedBox(width: SizeConfig.getWidthMultiplier()), ]
if (callMessageEng.isNotEmpty) ...[ ],
Expanded(
flex: 2,
child: AppText(
"($callMessageEng)",
color: ticketModel.callTypeEnum.getColorByCallType(),
fontSize: SizeConfig.getWidthMultiplier() * 1.8,
fontFamily: AppStrings.fontNamePoppins,
fontHeight: 1,
),
),
]
],
),
), ),
], ),
), ],
), ),
), ),
], ),
// ],
Expanded( Expanded(
flex: 2, flex: 2,
child: Center( child: Center(
@ -124,8 +124,6 @@ class PriorityTicketsWithSideSection extends StatelessWidget {
); );
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
List<TicketDetailsModel> priorityTickets = []; List<TicketDetailsModel> priorityTickets = [];

@ -24,6 +24,7 @@ class QueueItemCallingCard extends StatelessWidget {
final CallTypeEnum callTypeEnum; final CallTypeEnum callTypeEnum;
final ScreenTypeEnum screenTypeEnum; final ScreenTypeEnum screenTypeEnum;
final LanguageEnum langTypeEnum; final LanguageEnum langTypeEnum;
final QTypeEnum qTypeEnum;
final bool isSingleTicket; final bool isSingleTicket;
const QueueItemCallingCard({ const QueueItemCallingCard({
@ -39,6 +40,7 @@ class QueueItemCallingCard extends StatelessWidget {
required this.callTypeEnum, required this.callTypeEnum,
required this.screenTypeEnum, required this.screenTypeEnum,
required this.langTypeEnum, required this.langTypeEnum,
required this.qTypeEnum,
this.isGradientRequired = false, this.isGradientRequired = false,
this.isBorderRequired = false, this.isBorderRequired = false,
this.isSingleTicket = false, this.isSingleTicket = false,
@ -59,7 +61,7 @@ class QueueItemCallingCard extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final text = "${callTypeEnum.getMessageByCallTypeForEnglish(globalConfigurationsModel, isListView: false)} | $roomText $roomNo"; final text = callTypeEnum.getMessageByCallTypeForEnglish(globalConfigurationsModel, isListView: false) + (qTypeEnum == QTypeEnum.appointment ? ("| $roomText $roomNo") : "");
return Stack( return Stack(
children: [ children: [
customShadowSmoothContainerWithBackground( customShadowSmoothContainerWithBackground(
@ -82,7 +84,7 @@ class QueueItemCallingCard extends StatelessWidget {
left: textDirection == TextDirection.rtl ? SizeConfig.getWidthMultiplier() * 3.5 : 0, left: textDirection == TextDirection.rtl ? SizeConfig.getWidthMultiplier() * 3.5 : 0,
right: textDirection == TextDirection.ltr ? SizeConfig.getWidthMultiplier() * 3.5 : 0, right: textDirection == TextDirection.ltr ? SizeConfig.getWidthMultiplier() * 3.5 : 0,
), ),
child: callTypeEnum.getIconByCallType(SizeConfig.getHeightMultiplier() * 0.5), child: callTypeEnum.getIconByCallType(SizeConfig.getHeightMultiplier() * 0.5, qTypeEnum),
), ),
SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.15), SizedBox(height: SizeConfig.getHeightMultiplier()! * 0.15),
IntrinsicWidth( IntrinsicWidth(

@ -18,6 +18,7 @@ class QueueItemNormalCard extends StatelessWidget {
final GlobalConfigurationsModel globalConfigurationsModel; final GlobalConfigurationsModel globalConfigurationsModel;
final CallTypeEnum callTypeEnum; final CallTypeEnum callTypeEnum;
final ScreenTypeEnum screenTypeEnum; final ScreenTypeEnum screenTypeEnum;
final QTypeEnum qTypeEnum;
final LanguageEnum langTypeEnum; final LanguageEnum langTypeEnum;
final double? height; final double? height;
final double? width; final double? width;
@ -34,6 +35,7 @@ class QueueItemNormalCard extends StatelessWidget {
required this.callTypeEnum, required this.callTypeEnum,
required this.screenTypeEnum, required this.screenTypeEnum,
required this.langTypeEnum, required this.langTypeEnum,
required this.qTypeEnum,
this.height, this.height,
this.width, this.width,
}); });
@ -52,7 +54,8 @@ class QueueItemNormalCard extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final text = "${callTypeEnum.getMessageByCallTypeForEnglish(globalConfigurationsModel, isListView: false)} | $roomText $roomNo"; final text = callTypeEnum.getMessageByCallTypeForEnglish(globalConfigurationsModel, isListView: false) + (qTypeEnum == QTypeEnum.appointment ? ("| $roomText $roomNo") : "");
return Stack( return Stack(
children: [ children: [
customShadowSmoothContainer( customShadowSmoothContainer(
@ -87,12 +90,12 @@ class QueueItemNormalCard extends StatelessWidget {
flex: 3, flex: 3,
child: Row( child: Row(
children: [ children: [
callTypeEnum.getIconByCallType(SizeConfig.getHeightMultiplier() * 0.35), callTypeEnum.getIconByCallType(SizeConfig.getHeightMultiplier() * 0.35, qTypeEnum),
], ],
), ),
), ),
Flexible( Flexible(
flex: 4, flex: 2,
child: Center( child: Center(
child: AppText( child: AppText(
textAlign: TextAlign.center, textAlign: TextAlign.center,
@ -115,7 +118,7 @@ class QueueItemNormalCard extends StatelessWidget {
padding: EdgeInsets.all(SizeConfig.getHeightMultiplier() * 0.05), padding: EdgeInsets.all(SizeConfig.getHeightMultiplier() * 0.05),
color: callTypeEnum.getColorByCallType(), color: callTypeEnum.getColorByCallType(),
child: engArabicTextWithSeparatorWidget( child: engArabicTextWithSeparatorWidget(
fontSize: SizeConfig.getWidthMultiplier()! * 1.8, fontSize: qTypeEnum != QTypeEnum.appointment ? SizeConfig.getWidthMultiplier()! * 1.9 : SizeConfig.getWidthMultiplier()! * 1.8,
englishText: roomNo.extractNumbersIfLong(), englishText: roomNo.extractNumbersIfLong(),
arabicText: roomTextAr, arabicText: roomTextAr,
color: AppColors.whiteColor, color: AppColors.whiteColor,

@ -69,7 +69,7 @@ class _MainQueueScreenState extends State<MainQueueScreen> {
// counterNo: 0, // counterNo: 0,
// roomText: '', // roomText: '',
// ); // );
log("screenConfigViewModel: ${screenConfigViewModel.currentScreenIP}");
if (screenConfigViewModel.currentQTypeEnum == QTypeEnum.general) { if (screenConfigViewModel.currentQTypeEnum == QTypeEnum.general) {
text = AppStrings.awaitingQueueNumberEng; text = AppStrings.awaitingQueueNumberEng;
} }
@ -204,3 +204,4 @@ class _MainQueueScreenState extends State<MainQueueScreen> {
); );
} }
} }

Loading…
Cancel
Save