Merge branch 'main_latest_merged' into majd_development_new

# Conflicts:
#	assets/subtitles/ar_subtitle.json
#	assets/subtitles/en_subtitle.json
#	lib/main.dart
#	lib/models/service_request/service_request.dart
#	lib/views/pages/splash_screen.dart
#	lib/views/pages/user/notifications/notifications_page.dart
#	lib/views/pages/user/profile_page.dart
#	lib/views/pages/user/requests/create_request.dart
#	lib/views/pages/user/requests/request_details.dart
#	lib/views/pages/user/requests/requests_page.dart
#	lib/views/widgets/equipment/auto_complete_devices_field.dart
#	lib/views/widgets/equipment/single_device_picker.dart
merge-requests/29/head
nextwo 3 years ago
commit 8b7b40b0af

@ -196,4 +196,7 @@
"site": "الموقع",
"maintenanceSituation": "موقع الصيانه",
"currentSituation": "الموقع الحالي"
"duplicateRequest": "تكرار الطلب",
"comment" : "تعليق",
"updateServiceRequest" : "تعديل طلب الخدمة"
}

@ -195,6 +195,9 @@
"alert": "Alert",
"duplicateAlert": "Duplicate Alert",
"duplicateAlertMessage": "Are you sure you want to duplicate request?",
"duplicateRequest": "Duplicate Request",
"comment" : "Comment",
"updateServiceRequest" : "Update Service Request"
"duplicateRequest": "Duplicate Request"
}

@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 51;
objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
@ -227,6 +227,7 @@
};
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
@ -258,6 +259,7 @@
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);

@ -60,5 +60,7 @@
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
</dict>
</plist>

@ -14,7 +14,7 @@ class URLs {
static String getFileUrl(String file) => file == null || file.isEmpty ? null : "$_host/attachment/$file";
// API Routes
static get login => "$_baseUrl/MobileAuth/Login"; // post
static get login => "$_baseUrl/MobileAuth/LoginIntegration"; // post
static get register => "$_baseUrl/handle/create/user"; // post
static get updateProfile => "$_baseUrl/update/user/profile"; // post
static get getHospitals => "$_baseUrl/Customer/GetCustomers"; // get
@ -23,7 +23,10 @@ class URLs {
static get getModels => "$_baseUrl/ModelDefinition/GetModelDefinitionAsset"; // get ?client=2
// 08051
static get getServiceRequests => "$_baseUrl/CallRequest/GetCallRequests"; // get
static get getServiceRequestById => "$_baseUrl/CallRequest/GetCallRequestById"; // get
static get getServiceRequestThrough => "$_baseUrl/Lookups/GetLookup?lookupEnum=603"; // get
static get getServiceLoanAvailability => "$_baseUrl/Lookups/GetLookup?lookupEnum=4"; // get
static get getServiceFirstAction => "$_baseUrl/Lookups/GetLookup?lookupEnum=700"; // get
static get getServiceRequestTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=604"; // get
static get getServiceRequestStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=503";

@ -6,7 +6,6 @@ import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/http_status_manger.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/issue.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/service_report.dart';
import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/models/service_request/service_request_search.dart';
@ -136,17 +135,42 @@ class ServiceRequestsProvider extends ChangeNotifier {
@required ServiceRequest serviceRequest,
}) async {
var body = {
"callCreatedBy": {"id": user.id, "name": user.userName},
"id": 0,
"calNo": "",
"callCreatedBy": {"id": user.id, "name": user.userName ?? ""},
"assets": serviceRequest.deviceId == null ? [] : [serviceRequest.deviceId],
"requestedDate": DateTime.now().toIso8601String(),
"requestedTime": DateTime.now().toIso8601String(),
"client": user.hospital?.id ?? '',
"client": user.clientId,
"callComments": serviceRequest.maintenanceIssue,
"attachmentsCallRequest": serviceRequest.devicePhotos.map((e) => {"name": e}).toList(),
if (serviceRequest.devicePhotos.isNotEmpty) "attachmentsCallRequest": serviceRequest.devicePhotos.map((e) => {"name": e}).toList(),
"priority": serviceRequest.priority.toMap(),
"defectType": serviceRequest.defectType.toMap(),
"typeofRequest": serviceRequest.type.toMap(),
"requestedThrough": serviceRequest.type.toMap(),
"reviewComment": null,
if (serviceRequest.audio != null) "voiceNote": serviceRequest.audio,
"callSiteContactPerson": [
{
"id": 0,
// "employeeCode": user.email,
"name": user.userName,
"telephone": user.phoneNumber,
// "job": "",
"email": user.email,
// "land": "",
"contactUserId": user.id,
},
],
"noofFollowup": 0,
"status": null,
"callLastSituation": null,
"firstAction": null,
"loanAvailablity": null,
"comments": null,
"firstActionDate": null,
"visitDate": null,
"callReview": null,
};
if (serviceRequest.audio != null) {
body["voiceNote"] = serviceRequest.audio;
@ -191,16 +215,50 @@ class ServiceRequestsProvider extends ChangeNotifier {
Future<int> updateDate({
@required String host,
@required User user,
@required String newDate,
@required Lookup employee,
@required ServiceRequest request,
DateTime date,
}) async {
Map<String, dynamic> serviceRequest = await getServiceRequestById(requestId: request.id) ?? "";
final List callSiteContacts = (serviceRequest['callSiteContactPerson'] as List);
final Map<String, dynamic> callSiteContactPerson = callSiteContacts.isEmpty ? {} : callSiteContacts[0];
print(callSiteContactPerson);
Response response;
var body = {
"callCreatedBy": {"id": user.id, "name": user.userName},
"id": request.id,
"callNo": serviceRequest['callNo'],
"callCreatedBy": serviceRequest['callCreatedBy'],
"requestedDate": date?.toIso8601String() ?? "",
"requestedTime": date?.toIso8601String() ?? "",
"priority": request.priority?.toMap(),
"defectType": request.defectType?.toMap(),
"typeofRequest": request.type?.toMap(),
"requestedThrough": request.requestedThrough?.toMap(),
"voiceNote": request.audio,
"assets": request.deviceId == null ? [] : [request.deviceId],
"requestedDate": newDate,
"requestedTime": newDate,
"attachmentsCallRequest": request.devicePhotos?.map((e) => {"name": e})?.toList(),
"callSiteContactPerson": [
{
"id": callSiteContactPerson['id'] ?? 0,
"employeeCode": callSiteContactPerson['employeeCode'],
"name": callSiteContactPerson['name'] ?? user.userName,
"telephone": callSiteContactPerson['telephone'] ?? user.phoneNumber,
"job": callSiteContactPerson['job'],
"email": callSiteContactPerson['email'] ?? user.email,
"land": callSiteContactPerson['land'],
"contactUserId": user.id,
},
],
"callComments": request.maintenanceIssue,
"noofFollowup": 0,
// "status": null,
"callLastSituation": null,
"firstAction": request.firstAction?.toMap(),
"loanAvailablity": request.loanAvailability?.toMap(),
"comments": request.comment,
"firstActionDate": serviceRequest['firstActionDate'],
"visitDate": date?.toIso8601String() ?? "",
"callReview": null,
"reviewComment": null,
};
try {
response = await ApiManager.instance.put(
@ -209,7 +267,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
request.engineerName = employee.name;
// request.engineerName = employee.name;
notifyListeners();
}
return response.statusCode;
@ -394,4 +452,29 @@ class ServiceRequestsProvider extends ChangeNotifier {
throw (HttpStatusManger.getStatusMessage(status: response.statusCode, subtitle: subtitle));
}
}
Future<Map<String, dynamic>> getServiceRequestById({@required String requestId}) async {
Response response;
try {
response = await ApiManager.instance.get(
URLs.getServiceRequestById + "?callRequestId=$requestId",
);
} catch (error) {
print(error);
return {};
}
// If the call to the server was successful, parse the JSON.
if (response.statusCode >= 200 && response.statusCode < 300) {
// If the call to the server was successful, parse the JSON.
return {
"callNo": json.decode(response.body)["data"]["callNo"],
"callCreatedBy": json.decode(response.body)["data"]["callCreatedBy"],
"callSiteContactPerson": json.decode(response.body)["data"]["callSiteContactPerson"],
"firstActionDate": json.decode(response.body)["data"]["firstActionDate"],
};
} else {
return {};
}
}
}

@ -0,0 +1,69 @@
import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class ServiceFirstActionProvider extends ChangeNotifier {
//reset provider data
void reset() {
_statuses = null;
_stateCode = null;
}
// state code of current request to defied error message
// like 400 customer request failed
// 500 service not available
int _stateCode;
int get stateCode => _stateCode;
// contain user data
// when user not login or register _user = null
List<Lookup> _statuses;
List<Lookup> get items => _statuses;
// when categories in-process _loading = true
// done _loading = true
// failed _loading = false
bool _loading;
bool get isLoading => _loading;
set isLoading(bool isLoading) {
_loading = isLoading;
notifyListeners();
}
/// return -2 if request in progress
/// return -1 if error happen when sending request
/// return state code if request complete may be 200, 404 or 403
/// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getData({String host, User user}) async {
if (_loading == true) return -2;
_loading = true;
notifyListeners();
Response response;
try {
response = await ApiManager.instance.get(
URLs.getServiceFirstAction,
);
_stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List categoriesListJson = json.decode(response.body)["data"];
_statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList();
}
_loading = false;
notifyListeners();
return response.statusCode;
} catch (error) {
_loading = false;
_stateCode = -1;
notifyListeners();
return -1;
}
}
}

@ -0,0 +1,69 @@
import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class ServiceLoanAvailabilityProvider extends ChangeNotifier {
//reset provider data
void reset() {
_statuses = null;
_stateCode = null;
}
// state code of current request to defied error message
// like 400 customer request failed
// 500 service not available
int _stateCode;
int get stateCode => _stateCode;
// contain user data
// when user not login or register _user = null
List<Lookup> _statuses;
List<Lookup> get items => _statuses;
// when categories in-process _loading = true
// done _loading = true
// failed _loading = false
bool _loading;
bool get isLoading => _loading;
set isLoading(bool isLoading) {
_loading = isLoading;
notifyListeners();
}
/// return -2 if request in progress
/// return -1 if error happen when sending request
/// return state code if request complete may be 200, 404 or 403
/// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getData({String host, User user}) async {
if (_loading == true) return -2;
_loading = true;
notifyListeners();
Response response;
try {
response = await ApiManager.instance.get(
URLs.getServiceLoanAvailability,
);
_stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List categoriesListJson = json.decode(response.body)["data"];
_statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList();
}
_loading = false;
notifyListeners();
return response.statusCode;
} catch (error) {
_loading = false;
_stateCode = -1;
notifyListeners();
return -1;
}
}
}

@ -98,7 +98,8 @@ class UserProvider extends ChangeNotifier {
if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
_user = User.fromJson(jsonDecode(utf8.decode(response.bodyBytes))[0]);
_user.hospital = user.hospital;
_user.clientId = user.clientId;
_user.clientName = user.clientName;
notifyListeners();
return response.statusCode;
}
@ -123,8 +124,8 @@ class UserProvider extends ChangeNotifier {
Map<String, dynamic> jsonObject = {};
jsonObject["uid"] = user.id;
jsonObject["token"] = user.token;
if (user.department.id != _user.department.id) jsonObject["department"] = user.department.id;
if (user.whatsApp != _user.whatsApp) jsonObject["whatsapp"] = user.whatsApp;
if (user.departmentId != _user.departmentId) jsonObject["department"] = user.departmentId;
// if (user.whatsApp != _user.whatsApp) jsonObject["whatsapp"] = user.whatsApp;
if (user.phoneNumber != _user.phoneNumber) jsonObject["phone"] = user.phoneNumber;
try {
response = response = await ApiManager.instance.post(
@ -143,8 +144,10 @@ class UserProvider extends ChangeNotifier {
if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
_user = User.fromJson(jsonDecode(utf8.decode(response.bodyBytes))[0]);
_user.hospital = user.hospital;
_user.department = user.department;
_user.clientId = user.clientId;
_user.clientName = user.clientName;
_user.departmentName = user.departmentName;
_user.departmentId = user.departmentId;
notifyListeners();
return response.statusCode;
}

@ -1,6 +1,3 @@
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:provider/provider.dart';
import 'dart:io';
import 'package:firebase_core/firebase_core.dart';
@ -26,6 +23,8 @@ import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry
import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_first_action_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_loan_availability_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_status_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart';
@ -114,6 +113,8 @@ class MyApp extends StatelessWidget {
ChangeNotifierProvider(create: (_) => ServiceRequestedThroughProvider()),
ChangeNotifierProvider(create: (_) => ServiceRequestStatusProvider()),
ChangeNotifierProvider(create: (_) => EngineersProvider()),
ChangeNotifierProvider(create: (_) => ServiceLoanAvailabilityProvider()),
ChangeNotifierProvider(create: (_) => ServiceFirstActionProvider()),
],
child: GestureDetector(
onTap: () {
@ -153,7 +154,7 @@ class MyApp extends StatelessWidget {
ProfilePage.id: (_) => ProfilePage(),
ReportIssuesPage.id: (_) => const ReportIssuesPage(),
RequestGasRefill.id: (_) => const RequestGasRefill(),
CreateRequestPage.id: (_) => CreateRequestPage(),
CreateRequestPage.id: (_) => const CreateRequestPage(),
SingleHospitalPicker.id: (_) => SingleHospitalPicker(),
SingleDevicePicker.id: (_) => SingleDevicePicker(),
SingleDepartmentPicker.id: (_) => SingleDepartmentPicker(),

@ -19,6 +19,7 @@ class ServiceRequest {
String audio;
int statusValue;
String statusLabel;
String comment;
bool viewReport;
String engineerMobile;
@ -34,6 +35,8 @@ class ServiceRequest {
Lookup defectType;
Lookup type;
Lookup requestedThrough;
Lookup firstAction;
Lookup loanAvailability;
Device device;
ServiceRequest({
@ -68,6 +71,9 @@ class ServiceRequest {
this.type,
this.requestedThrough,
this.device,
this.comment,
this.loanAvailability,
this.firstAction,
});
factory ServiceRequest.fromJson(Map<String, dynamic> parsedJson) {
@ -77,32 +83,40 @@ class ServiceRequest {
images = list.map((e) => URLs.getFileUrl(e["attachmentsCallRequest"])).toList();
}
return ServiceRequest(
id: parsedJson["id"].toString(),
requestCode: parsedJson["callNo"].toString(),
hospitalName: parsedJson["asset"]["site"]["custName"],
deviceNumber: parsedJson["asset"]["assetNumber"].toString(),
deviceId: parsedJson["asset"]["id"],
audio: URLs.getFileUrl(parsedJson["voiceNote"] ?? ""),
deviceArName: parsedJson["asset"]["modelDefinition"]["assetName"] ?? "",
deviceEnName: parsedJson["asset"]["modelDefinition"]["assetName"] ?? "",
devicePhotos: images,
deviceSerialNumber: parsedJson["asset"]["assetSerialNo"],
date: DateTime.tryParse(parsedJson["requestedDate"] ?? "").toString().split(" ").first,
maintenanceIssue: parsedJson["comments"],
statusLabel: parsedJson["status"] == null ? null : parsedJson["status"]["name"],
statusValue: parsedJson["status"] == null ? null : parsedJson["status"]["value"],
departmentName: parsedJson["asset"]["department"] != null ? parsedJson["asset"]["department"]["name"] : "",
engineerName: parsedJson["assignedEmployee"] == null ? null : parsedJson["assignedEmployee"]["name"],
hospitalId: parsedJson["asset"]["site"]["id"],
reportID: parsedJson["workOrder"] != null ? parsedJson["workOrder"]["workOrderId"] : null,
viewReport: parsedJson["workOrder"] != null,
deviceModel: parsedJson["asset"]["modelDefinition"]["modelName"],
engineerMobile: parsedJson["assignedEmployee"] == null ? null : parsedJson["assignedEmployee"]["phone"],
faultDescription: parsedJson["workOrder"] != null ? parsedJson["workOrder"]["faultDescription"] : null,
jobSheetNumber: parsedJson["workOrder"] != null ? parsedJson["workOrder"]["jobSheetNumber"] : null,
visitDate: DateTime.tryParse(parsedJson["visitDate"] ?? "").toString().split(" ").first,
nextVisitDate: DateTime.tryParse(parsedJson["nextVisitDate"] ?? ""),
workPerformed: parsedJson["workOrder"] != null ? parsedJson["workOrder"]["workPerformed"] : null,
device: Device.fromJson(parsedJson["asset"]));
id: parsedJson["id"].toString(),
requestCode: parsedJson["callNo"].toString(),
hospitalName: parsedJson["asset"]["site"]["custName"],
deviceNumber: parsedJson["asset"]["assetNumber"].toString(),
deviceId: parsedJson["asset"]["id"],
audio: URLs.getFileUrl(parsedJson["voiceNote"] ?? ""),
deviceArName: parsedJson["asset"]["modelDefinition"]["assetName"] ?? "",
deviceEnName: parsedJson["asset"]["modelDefinition"]["assetName"] ?? "",
devicePhotos: images,
deviceSerialNumber: parsedJson["asset"]["assetSerialNo"],
date: DateTime.tryParse(parsedJson["requestedDate"] ?? "").toString().split(" ").first,
maintenanceIssue: parsedJson["comments"],
statusLabel: parsedJson["status"] == null ? null : parsedJson["status"]["name"],
statusValue: parsedJson["status"] == null ? null : parsedJson["status"]["value"],
departmentName: parsedJson["asset"]["department"] != null ? parsedJson["asset"]["department"]["name"] : "",
engineerName: parsedJson["assignedEmployee"] == null ? null : parsedJson["assignedEmployee"]["name"],
hospitalId: parsedJson["asset"]["site"]["id"],
reportID: parsedJson["workOrder"] != null ? parsedJson["workOrder"]["workOrderId"] : null,
viewReport: parsedJson["workOrder"] != null,
deviceModel: parsedJson["asset"]["modelDefinition"]["modelName"],
engineerMobile: parsedJson["assignedEmployee"] == null ? null : parsedJson["assignedEmployee"]["phone"],
faultDescription: parsedJson["workOrder"] != null ? parsedJson["workOrder"]["faultDescription"] : null,
jobSheetNumber: parsedJson["workOrder"] != null ? parsedJson["workOrder"]["jobSheetNumber"] : null,
visitDate: DateTime.tryParse(parsedJson["visitDate"] ?? "").toString().split(" ").first,
nextVisitDate: DateTime.tryParse(parsedJson["nextVisitDate"] ?? ""),
workPerformed: parsedJson["workOrder"] != null ? parsedJson["workOrder"]["workPerformed"] : null,
device: Device.fromJson(parsedJson["asset"]),
comment: parsedJson["reviewComment"],
type: Lookup.fromJson(parsedJson['typeofRequest']),
defectType: Lookup.fromJson(parsedJson['defectType']),
loanAvailability: Lookup.fromJson(parsedJson['loanAvailability']),
firstAction: Lookup.fromJson(parsedJson['firstAction']),
requestedThrough: Lookup.fromJson(parsedJson['requestedThrough']),
priority: Lookup.fromJson(parsedJson['priority']),
);
}
}

@ -222,6 +222,8 @@ class Subtitle {
String duplicateAlert;
String duplicateAlertMessage;
String alert;
String comment;
String updateServiceRequest;
void setIssues(List<String> issues) {
issues.clear();
@ -233,6 +235,8 @@ class Subtitle {
}
Subtitle({
@required this.updateServiceRequest,
@required this.comment,
@required this.currentlyServiceNotAvailable,
@required this.waitUntilYourRequestComplete,
@required this.requestCompleteSuccessfully,
@ -423,6 +427,8 @@ class Subtitle {
factory Subtitle.fromJson(Map<String, dynamic> parsedJson) {
return Subtitle(
updateServiceRequest: parsedJson["updateServiceRequest"],
comment: parsedJson["comment"],
currentlyServiceNotAvailable: parsedJson["server_error_message"],
failedToCompleteRequest: parsedJson["failed_request_message"],
requestCompleteSuccessfully: parsedJson["successful_request_message"],

@ -1,108 +1,219 @@
import 'package:test_sa/controllers/notification/firebase_notification_manger.dart';
import 'package:test_sa/models/department.dart';
import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/hospital.dart';
class User {
int clientId;
String clientName;
int departmentId;
String departmentName;
String message;
String username;
String userID;
String email;
String password;
String token;
dynamic roles;
List<UserRoles> userRoles;
String tokenlife;
bool isAuthenticated;
bool hasError;
String profilePhotoName;
String id;
String userName;
String password;
String email;
Hospital hospital;
Department department;
UsersTypes type;
String normalizedUserName;
String normalizedEmail;
bool emailConfirmed;
dynamic passwordHash;
String securityStamp;
String concurrencyStamp;
String phoneNumber;
String whatsApp;
String token;
bool isActive;
DateTime tokenLife;
bool phoneNumberConfirmed;
bool twoFactorEnabled;
dynamic lockoutEnd;
bool lockoutEnabled;
int accessFailedCount;
User(
{this.id,
this.userName = "",
this.email = "",
this.password = "",
this.phoneNumber = "",
this.hospital,
this.department,
this.type,
this.whatsApp,
this.token,
this.tokenLife,
this.isActive = false});
User({
this.clientId,
this.clientName,
this.departmentId,
this.departmentName,
this.message,
this.username,
this.userID,
this.email,
this.password,
this.token,
this.roles,
this.userRoles,
this.tokenlife,
this.isAuthenticated,
this.hasError,
this.profilePhotoName,
this.id,
this.userName,
this.normalizedUserName,
this.normalizedEmail,
this.emailConfirmed,
this.passwordHash,
this.securityStamp,
this.concurrencyStamp,
this.phoneNumber,
this.phoneNumberConfirmed,
this.twoFactorEnabled,
this.lockoutEnd,
this.lockoutEnabled,
this.accessFailedCount,
});
Future<Map<String, dynamic>> toLoginJson() async {
if (FirebaseNotificationManger.token == null) await FirebaseNotificationManger.getToken();
return {
"username": userName,
"password": password,
"firebase_token": FirebaseNotificationManger?.token ?? "",
"fireBaseToken": FirebaseNotificationManger?.token ?? "",
};
}
UsersTypes get type {
switch (userRoles.first.name) {
case "Engineer":
return UsersTypes.engineer;
case "Hospital":
return UsersTypes.normal_user;
default:
return null;
}
}
Map<String, dynamic> toUpdateProfileJson() {
Map<String, dynamic> jsonObject = {};
if (department?.id != null) jsonObject["department"] = department.id;
if (whatsApp != null && whatsApp.isNotEmpty) jsonObject["whatsapp"] = whatsApp;
if (phoneNumber != null && phoneNumber.isNotEmpty) jsonObject["phone"] = phoneNumber;
// if (departmentId != null) jsonObject["department"] = departmentId;
// if (whatsApp != null && whatsApp.isNotEmpty) jsonObject["whatsapp"] = whatsApp;
// if (phoneNumber != null && phoneNumber.isNotEmpty) jsonObject["phone"] = phoneNumber;
return jsonObject;
}
Future<Map<String, dynamic>> toRegisterJson() async {
if (FirebaseNotificationManger.token == null) await FirebaseNotificationManger.getToken();
// if (FirebaseNotificationManger.token == null) await FirebaseNotificationManger.getToken();
return {
"username": userName,
"email": email,
"whatsapp": whatsApp,
"client": hospital.id,
"department": department?.id,
"phone": phoneNumber,
"pass": password,
"firebase_token": FirebaseNotificationManger?.token ?? "",
// "username": userName,
// "email": email,
// "whatsapp": whatsApp,
// "client": hospital.id,
// "department": department?.id,
// "phone": phoneNumber,
// "pass": password,
// "firebase_token": FirebaseNotificationManger?.token ?? "",
};
}
Map<String, dynamic> toJson() {
return {
"userID": id,
"username": userName,
"email": email,
"token": token,
"phoneNumber": phoneNumber,
"whatsapp": whatsApp,
"client_id": hospital?.id,
"client_name": hospital?.name,
"department_id": department?.id,
"department_name": department?.name,
//"password":password,
"tokenlife": tokenLife.toIso8601String(),
"active": isActive,
"userRoles": type == UsersTypes.engineer ? "value: R-6" : "value: R-5",
// "token":token, pass is token
};
final map = <String, dynamic>{};
map['client_id'] = clientId;
map['client_name'] = clientName;
map['department_id'] = departmentId;
map['department_name'] = departmentName;
map['message'] = message;
map['username'] = username;
map['userID'] = userID;
map['email'] = email;
map['password'] = password;
map['token'] = token;
map['roles'] = roles;
if (userRoles != null) {
map['userRoles'] = userRoles.map((v) => v.toJson()).toList();
}
map['tokenlife'] = tokenlife;
map['isAuthenticated'] = isAuthenticated;
map['hasError'] = hasError;
map['profilePhotoName'] = profilePhotoName;
map['id'] = id;
map['userName'] = userName;
map['normalizedUserName'] = normalizedUserName;
map['normalizedEmail'] = normalizedEmail;
map['emailConfirmed'] = emailConfirmed;
map['passwordHash'] = passwordHash;
map['securityStamp'] = securityStamp;
map['concurrencyStamp'] = concurrencyStamp;
map['phoneNumber'] = phoneNumber;
map['phoneNumberConfirmed'] = phoneNumberConfirmed;
map['twoFactorEnabled'] = twoFactorEnabled;
map['lockoutEnd'] = lockoutEnd;
map['lockoutEnabled'] = lockoutEnabled;
map['accessFailedCount'] = accessFailedCount;
return map;
}
factory User.fromJson(Map<String, dynamic> parsedJson) {
UsersTypes type;
if (parsedJson["userRoles"].toString().contains("value: R-4") || parsedJson["userRoles"].toString().contains("value: R-5") || parsedJson["userRoles"].toString().contains("value: R-7")) {
type = UsersTypes.normal_user;
} else {
type = UsersTypes.engineer;
User.fromJson(dynamic json) {
clientId = json['client_id'];
clientName = json['client_name'];
departmentId = json['department_id'];
departmentName = json['department_name'];
message = json['message'];
username = json['username'];
userID = json['userID'];
email = json['email'];
password = json['password'];
token = json['token'];
roles = json['roles'];
if (json['userRoles'] != null) {
userRoles = [];
json['userRoles'].forEach((v) {
userRoles.add(UserRoles.fromJson(v));
});
}
return User(
id: parsedJson["userID"],
userName: parsedJson["username"],
email: parsedJson["email"],
hospital: Hospital(id: parsedJson["client_id"], name: parsedJson["client_name"]),
department: Department(
id: parsedJson["department_id"],
name: parsedJson["department_name"],
),
phoneNumber: parsedJson["phoneNumber"],
whatsApp: parsedJson["phoneNumber"],
token: parsedJson["token"],
isActive: parsedJson["isAuthenticated"],
tokenLife: DateTime.tryParse(parsedJson["tokenlife"] ?? ""),
type: type);
tokenlife = json['tokenlife'];
isAuthenticated = json['isAuthenticated'];
hasError = json['hasError'];
profilePhotoName = json['profilePhotoName'];
id = json['id'];
userName = json['userName'];
normalizedUserName = json['normalizedUserName'];
normalizedEmail = json['normalizedEmail'];
emailConfirmed = json['emailConfirmed'];
passwordHash = json['passwordHash'];
securityStamp = json['securityStamp'];
concurrencyStamp = json['concurrencyStamp'];
phoneNumber = json['phoneNumber'];
phoneNumberConfirmed = json['phoneNumberConfirmed'];
twoFactorEnabled = json['twoFactorEnabled'];
lockoutEnd = json['lockoutEnd'];
lockoutEnabled = json['lockoutEnabled'];
accessFailedCount = json['accessFailedCount'];
}
}
class UserRoles {
UserRoles({
this.id,
this.name,
this.value,
});
UserRoles.fromJson(dynamic json) {
id = json['id'];
name = json['name'];
value = json['value'];
}
String id;
String name;
String value;
UserRoles copyWith({
String id,
String name,
String value,
}) =>
UserRoles(
id: id ?? this.id,
name: name ?? this.name,
value: value ?? this.value,
);
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = id;
map['name'] = name;
map['value'] = value;
return map;
}
}

@ -59,7 +59,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
_isLoading = true;
setState(() {});
_formModel.sender?.client?.id = _userProvider.user?.hospital?.id;
_formModel.sender?.client?.id = _userProvider.user?.clientId;
int status = await _deviceTransferProvider.createRequest(
user: _userProvider.user,
host: _settingProvider.host,

@ -113,7 +113,7 @@ class _LoginState extends State<Login> {
user: _user,
host: _settingProvider.host,
);
if (status >= 200 && status < 300 && _userProvider.user?.userName != null) {
if (status >= 200 && status < 300) {
_settingProvider.setUser(_userProvider.user);
// if (_userProvider.user.isActive)
Navigator.of(context).pushNamed(LandPage.id);

@ -1,12 +1,13 @@
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/api_routes/http_status_manger.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/controllers/validator/validator.dart';
import 'package:test_sa/models/department.dart';
import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/user.dart';
import 'package:test_sa/views/widgets/app_text_form_field.dart';
@ -123,17 +124,19 @@ class _RegisterState extends State<Register> {
),
const SizedBox(height: 12),
HospitalButton(
hospital: _user.hospital,
hospital: Hospital(id: _user.clientId, name: _user.clientName),
onHospitalPick: (hospital) {
_user.hospital = hospital;
_user.clientId = hospital.id;
_user.clientName = hospital.name;
setState(() {});
},
),
const SizedBox(height: 12),
DepartmentButton(
department: _user.department,
department: Department(id: _user.departmentId, name: _user.departmentName),
onDepartmentPick: (department) {
_user.department = department;
_user.departmentId = department.id;
_user.departmentName = department.name;
setState(() {});
},
),
@ -150,31 +153,31 @@ class _RegisterState extends State<Register> {
},
),
SizedBox(height: 8),
ATextFormField(
initialValue: _user.whatsApp,
hintText: _subtitle.whatsApp,
style: Theme.of(context).textTheme.headline6,
prefixIconData: FontAwesomeIcons.whatsapp,
prefixIconSize: 36,
validator: (value) => Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage,
textInputType: TextInputType.phone,
onSaved: (value) {
_user.whatsApp = value;
},
),
// ATextFormField(
// initialValue: _user.whatsApp,
// hintText: _subtitle.whatsApp,
// style: Theme.of(context).textTheme.headline6,
// prefixIconData: FontAwesomeIcons.whatsapp,
// prefixIconSize: 36,
// validator: (value) => Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage,
// textInputType: TextInputType.phone,
// onSaved: (value) {
// _user.whatsApp = value;
// },
// ),
const SizedBox(height: 12),
AButton(
text: _subtitle.signUp,
onPressed: () async {
if (!_formKey.currentState.validate()) return;
_formKey.currentState.save();
if (_user.hospital == null) {
if (_user.clientId == null) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(_subtitle.hospitalRequired),
));
return;
}
if (_user.department == null) {
if (_user.departmentId == null) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(_subtitle.unitRequired),
));

@ -26,7 +26,7 @@ class _SplashScreenState extends State<SplashScreen> {
UserProvider _userProvider;
_goToUserScreen(User user) {
if (user.tokenLife != null && user.tokenLife.isAfter(DateTime.now())) {
if (user.tokenlife != null && (DateTime.tryParse(user.tokenlife)?.isAfter(DateTime.now()) ?? false)) {
_userProvider.user = user;
// Navigator.of(context).pushNamed(Login.id);
Navigator.of(context).pushNamed(LandPage.id);

@ -38,7 +38,7 @@ class _NotificationsPageState extends State<NotificationsPage> with TickerProvid
await _notificationsProvider.getNotifications(
user: _userProvider.user,
host: _settingProvider.host,
hospitalId: _userProvider.user.hospital.id,
hospitalId: _userProvider.user.clientId,
);
},
child: Stack(
@ -76,7 +76,7 @@ class _NotificationsPageState extends State<NotificationsPage> with TickerProvid
await _notificationsProvider.getNotifications(
user: _userProvider.user,
host: _settingProvider.host,
hospitalId: _userProvider.user.hospital.id,
hospitalId: _userProvider.user.clientId,
);
},
notifications: _notificationsProvider.notifications,

@ -1,11 +1,12 @@
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/api_routes/http_status_manger.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/controllers/validator/validator.dart';
import 'package:test_sa/models/department.dart';
import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/user.dart';
import 'package:test_sa/views/app_style/colors.dart';
@ -107,9 +108,10 @@ class _ProfilePageState extends State<ProfilePage> {
),
AbsorbPointer(
child: HospitalButton(
hospital: _user.hospital,
hospital: Hospital(name: _user.clientName, id: _user.clientId),
onHospitalPick: (hospital) {
_user.hospital = hospital;
_user.clientName = hospital.name;
_user.clientId = hospital.id;
setState(() {});
},
),
@ -118,9 +120,10 @@ class _ProfilePageState extends State<ProfilePage> {
height: 8,
),
DepartmentButton(
department: _user.department,
department: Department(name: _user.departmentName, id: _user.departmentId),
onDepartmentPick: (department) {
_user.department = department;
_user.departmentName = department.name;
_user.departmentId = department.id;
setState(() {});
},
),
@ -141,18 +144,19 @@ class _ProfilePageState extends State<ProfilePage> {
SizedBox(
height: 8,
),
ATextFormField(
initialValue: _user.whatsApp,
hintText: _subtitle.whatsApp,
style: Theme.of(context).textTheme.headline6,
prefixIconData: FontAwesomeIcons.whatsapp,
prefixIconSize: 36,
validator: (value) => Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage,
textInputType: TextInputType.phone,
onSaved: (value) {
_user.whatsApp = value;
},
),
// ATextFormField(
// initialValue: _user.whatsApp,
// hintText: _subtitle.whatsApp,
// style: Theme.of(context).textTheme.headline6,
// prefixIconData: FontAwesomeIcons.whatsapp,
// prefixIconSize: 36,
// validator: (value) =>
// Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage,
// textInputType: TextInputType.phone,
// onSaved: (value){
// _user.whatsApp = value;
// },
// ),
],
),
),
@ -168,7 +172,7 @@ class _ProfilePageState extends State<ProfilePage> {
onPressed: () async {
if (!_formKey.currentState.validate()) return;
_formKey.currentState.save();
if (_user.department?.id == null) {
if (_user.departmentId == null) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(_subtitle.unitRequired),
));

@ -32,36 +32,52 @@ import 'package:test_sa/views/widgets/status/service_request/service_request_thr
import 'package:test_sa/views/widgets/status/service_request/service_request_types_mune.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
import '../../../widgets/date_and_time/date_picker.dart';
import '../../../widgets/status/service_request/service_request_first_action.dart';
import '../../../widgets/status/service_request/service_request_loan_availability.dart';
class CreateRequestPage extends StatefulWidget {
static final String id = "/create-request";
static const String id = "/create-request";
final ServiceRequest serviceRequest;
const CreateRequestPage({this.serviceRequest, Key key}) : super(key: key);
@override
_CreateRequestPageState createState() => _CreateRequestPageState();
CreateRequestPageState createState() => CreateRequestPageState();
}
class _CreateRequestPageState extends State<CreateRequestPage> {
class CreateRequestPageState extends State<CreateRequestPage> {
double _height;
UserProvider _userProvider;
SettingProvider _settingProvider;
ServiceRequestsProvider _serviceRequestsProvider;
ServiceRequest _serviceRequest = ServiceRequest();
List<File> _deviceImages = [];
ServiceRequest _serviceRequest;
final List<File> _deviceImages = [];
bool _isLoading = false;
Device _device;
Subtitle _subtitle;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
TextEditingController _controller;
TextEditingController _maintenanceController, _commentController;
DateTime _dateTime;
@override
void initState() {
_controller = TextEditingController();
_maintenanceController = TextEditingController();
_commentController = TextEditingController();
if (widget.serviceRequest != null) {
_serviceRequest = widget.serviceRequest;
_device = _serviceRequest.device;
_deviceImages.addAll(_serviceRequest.devicePhotos.map((e) => File(e)).toList());
} else {
_serviceRequest = ServiceRequest();
}
super.initState();
}
@override
void dispose() {
_controller.dispose();
_maintenanceController.dispose();
_commentController.dispose();
super.dispose();
}
@ -87,21 +103,19 @@ class _CreateRequestPageState extends State<CreateRequestPage> {
ListView(
children: [
//AppNameBar(),
SizedBox(
height: 16,
),
const SizedBox(height: 16),
Hero(
tag: "logo",
child: Image(
height: _height / 6,
image: AssetImage("assets/images/logo.png"),
image: const AssetImage("assets/images/logo.png"),
),
),
Center(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
_subtitle.newServiceRequest,
widget.serviceRequest == null ? _subtitle.newServiceRequest : _subtitle.updateServiceRequest,
style: Theme.of(context).textTheme.headline5.copyWith(color: AColors.cyan, fontWeight: FontWeight.w600),
),
),
@ -110,21 +124,21 @@ class _CreateRequestPageState extends State<CreateRequestPage> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
12.height,
_userProvider.user.hospital == null
? SizedBox.shrink()
_userProvider.user.clientId == null
? const SizedBox.shrink()
: ATextFormField(
enable: false,
initialValue: _userProvider.user.hospital?.name ?? _subtitle.noHospitalFound,
initialValue: _userProvider.user.clientName ?? _subtitle.noHospitalFound,
hintText: _subtitle.hospital,
prefixIconData: FontAwesomeIcons.hospital,
style: Theme.of(context).textTheme.subtitle1,
),
12.height,
_userProvider.user.department == null
? SizedBox.shrink()
_userProvider.user.departmentId == null
? const SizedBox.shrink()
: ATextFormField(
enable: false,
initialValue: _userProvider.user.department?.name ?? _subtitle.noUniteFound,
initialValue: _userProvider.user.departmentName ?? _subtitle.noUniteFound,
hintText: _subtitle.unite,
prefixIconData: FontAwesomeIcons.hospitalUser,
style: Theme.of(context).textTheme.subtitle1,
@ -185,21 +199,57 @@ class _CreateRequestPageState extends State<CreateRequestPage> {
height: 4,
),
ServiceRequestedThroughMenu(
initialValue: const Lookup(name: "App", value: 3),
initialValue: const Lookup(name: "App", value: 375),
onSelect: (status) {
_serviceRequest.requestedThrough = status;
},
),
if (widget.serviceRequest != null) 12.height,
if (widget.serviceRequest != null) const ASubTitle("First Action"),
const SizedBox(
height: 4,
),
if (widget.serviceRequest != null)
ServiceRequestedFirstAction(
initialValue: _serviceRequest.firstAction,
onSelect: (status) {
_dateTime = null;
_serviceRequest.firstAction = status;
_serviceRequestsProvider.notifyListeners();
},
),
if (_serviceRequest.firstAction != null) 12.height,
if (_serviceRequest.firstAction != null)
ADatePicker(
date: _dateTime,
from: DateTime.now(),
onDatePicker: (date) {
_dateTime = date;
setState(() {});
},
),
if (widget.serviceRequest != null) 12.height,
if (widget.serviceRequest != null) const ASubTitle("Loan Availability"),
const SizedBox(
height: 4,
),
if (widget.serviceRequest != null)
ServiceRequestedLoanAvailability(
initialValue: _serviceRequest.loanAvailability,
onSelect: (status) {
_serviceRequest.loanAvailability = status;
},
),
12.height,
MultiImagesPicker(
label: _subtitle.deviceImages,
images: _deviceImages,
),
12.height,
SpeechToTextButton(controller: _controller),
SpeechToTextButton(controller: _maintenanceController),
12.height,
ATextFormField(
controller: _controller,
controller: _maintenanceController,
initialValue: _serviceRequest.maintenanceIssue,
hintText: _subtitle.maintenanceIssue,
prefixIconData: FontAwesomeIcons.triangleExclamation,
@ -215,16 +265,35 @@ class _CreateRequestPageState extends State<CreateRequestPage> {
_serviceRequest.audio = audio;
}),
12.height,
if (widget.serviceRequest != null)
ATextFormField(
controller: _commentController,
initialValue: _serviceRequest.comment,
hintText: _subtitle.comment,
style: Theme.of(context).textTheme.titleMedium,
textInputType: TextInputType.multiline,
onSaved: (value) {
_serviceRequest.comment = value;
},
),
],
).paddingOnly(left: 20, right: 20),
Padding(
padding: const EdgeInsets.all(20.0),
child: AButton(
text: _subtitle.submit,
text: widget.serviceRequest == null ? _subtitle.submit : _subtitle.update,
onPressed: () async {
if (!_formKey.currentState.validate()) return;
if (_device?.id == null) {
Fluttertoast.showToast(msg: _subtitle.pickDevice);
return;
}
if (_serviceRequest.firstAction != null && _dateTime == null) {
Fluttertoast.showToast(msg: _subtitle.noDateFound);
return;
}
_formKey.currentState.save();
_serviceRequest.deviceId = _device?.id ?? "";
_serviceRequest.deviceId = _device?.id;
_isLoading = true;
setState(() {});
_serviceRequest.devicePhotos = _deviceImages.map((e) => "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}").toList();
@ -232,11 +301,21 @@ class _CreateRequestPageState extends State<CreateRequestPage> {
final file = File(_serviceRequest.audio);
_serviceRequest.audio = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}";
}
int status = await _serviceRequestsProvider.createRequest(
user: _userProvider.user,
host: _settingProvider.host,
serviceRequest: _serviceRequest,
);
int status = 0;
if (widget.serviceRequest == null) {
status = await _serviceRequestsProvider.createRequest(
user: _userProvider.user,
host: _settingProvider.host,
serviceRequest: _serviceRequest,
);
} else {
status = await _serviceRequestsProvider.updateDate(
user: _userProvider.user,
host: _settingProvider.host,
request: _serviceRequest,
date: _dateTime,
);
}
_isLoading = false;
setState(() {});
if (status >= 200 && status < 300) {
@ -255,7 +334,7 @@ class _CreateRequestPageState extends State<CreateRequestPage> {
),
],
),
ABackButton(),
const ABackButton(),
],
),
),

@ -47,7 +47,7 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage> with TickerPr
await _serviceRequestsProvider.getRequests(
user: _userProvider.user,
host: _settingProvider.host,
hospitalId: _userProvider.user.hospital?.id,
hospitalId: _userProvider.user.clientId,
);
},
child: Stack(
@ -107,7 +107,7 @@ class _ServiceRequestsPageState extends State<ServiceRequestsPage> with TickerPr
await _serviceRequestsProvider.getRequests(
user: _userProvider.user,
host: _settingProvider.host,
hospitalId: _userProvider.user.hospital.id,
hospitalId: _userProvider.user.clientId,
);
},
requests: _serviceRequestsProvider.serviceRequests,

@ -76,7 +76,7 @@ class _AutoCompleteDeviceFieldState extends State<AutoCompleteDeviceField> {
return await _devicesProvider.getDevicesList(
host: _settingProvider.host,
user: _userProvider.user,
hospitalId: widget.hospitalId ?? _userProvider.user.hospital.id,
hospitalId: widget.hospitalId ?? _userProvider.user.clientId,
serialNumber: value,
);
},

@ -11,7 +11,6 @@ import 'package:test_sa/views/widgets/equipment/device_item.dart';
import 'package:test_sa/views/widgets/loaders/lazy_loading.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
import 'package:test_sa/views/widgets/qr/scan_qr.dart';
import '../app_text_form_field.dart';
@ -40,7 +39,7 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
builder: (dialogContext) {
return const Center(child: CircularProgressIndicator());
});
List<Device> devices = await _devicesProvider.getDevicesListBySN(host: _settingProvider.host, user: _userProvider.user, hospitalId: _userProvider.user.hospital.id, sn: result);
List<Device> devices = await _devicesProvider.getDevicesListBySN(host: _settingProvider.host, user: _userProvider.user, hospitalId: _userProvider.user.clientId, sn: result);
Navigator.of(context).pop();
if (devices.isEmpty) {
Fluttertoast.showToast(msg: _subtitle.noDeviceFound);
@ -80,7 +79,7 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
isFailedLoading: _devicesProvider.devices == null,
onRefresh: () async {
_devicesProvider.reset();
await _devicesProvider.getEquipment(user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.hospital?.id);
await _devicesProvider.getEquipment(user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId);
},
child: Column(
children: [
@ -98,7 +97,7 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
onAction: () async {
_devicesProvider.reset();
await _devicesProvider.getEquipment(
user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.hospital?.id, serialNumber: snController.text, number: numberController.text);
user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId, serialNumber: snController.text, number: numberController.text);
_searchableList.clear();
_searchableList.addAll(_devicesProvider.devices);
},
@ -115,7 +114,7 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
onAction: () async {
_devicesProvider.reset();
await _devicesProvider.getEquipment(
user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.hospital?.id, serialNumber: snController.text, number: numberController.text);
user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId, serialNumber: snController.text, number: numberController.text);
_searchableList.clear();
_searchableList.addAll(_devicesProvider.devices);
},
@ -132,7 +131,7 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
nextPage: _devicesProvider.nextPage,
onLazyLoad: () async {
await _devicesProvider.getDevicesList(
user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.hospital?.id, serialNumber: snController.text, number: numberController.text);
user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId, serialNumber: snController.text, number: numberController.text);
},
child: ListView.builder(
padding: EdgeInsets.zero,

@ -71,7 +71,7 @@ class _PentryCalibrationToolFormState extends State<PentryCalibrationToolForm> {
),
AutoCompleteDeviceNumberField(
initialValue: model.assetsNumber,
hospitalId: userProvider.user.hospital?.id,
hospitalId: userProvider.user.clientId,
onPick: (number) {
model.assetsNumber = number;
},

@ -54,8 +54,7 @@ class _ServiceRequestsUpdateDialogState extends State<ServiceRequestsUpdateDialo
);
},
);
int status = await _serviceRequestsProvider.updateDate(
user: _userProvider.user, host: _settingProvider.host, request: widget.request, newDate: _dateTime?.toString()?.split(" ")?.first, employee: _employee);
int status = await _serviceRequestsProvider.updateDate(user: _userProvider.user, host: _settingProvider.host, request: widget.request);
if (status == 200) Navigator.of(context).pop();
Navigator.of(context).pop();
Fluttertoast.showToast(

@ -0,0 +1,36 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/status/single_status_menu.dart';
import '../../../../controllers/providers/api/status_drop_down/service_reqest/service_request_first_action_provider.dart';
class ServiceRequestedFirstAction extends StatelessWidget {
final Function(Lookup) onSelect;
final Lookup initialValue;
const ServiceRequestedFirstAction({Key key, this.onSelect, this.initialValue}) : super(key: key);
@override
Widget build(BuildContext context) {
final settingProvider = Provider.of<SettingProvider>(context);
final userProvider = Provider.of<UserProvider>(context);
final menuProvider = Provider.of<ServiceFirstActionProvider>(context);
return LoadingManager(
isLoading: menuProvider.isLoading,
isFailedLoading: menuProvider.items == null,
stateCode: menuProvider.stateCode,
onRefresh: () async {
menuProvider.reset();
await menuProvider.getData(user: userProvider.user, host: settingProvider.host);
},
child: SingleStatusMenu(
initialStatus: initialValue,
statuses: menuProvider.items,
onSelect: onSelect,
),
);
}
}

@ -0,0 +1,35 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/status/single_status_menu.dart';
import '../../../../controllers/providers/api/status_drop_down/service_reqest/service_request_loan_availability_provider.dart';
class ServiceRequestedLoanAvailability extends StatelessWidget {
final Function(Lookup) onSelect;
final Lookup initialValue;
const ServiceRequestedLoanAvailability({Key key, this.onSelect, this.initialValue}) : super(key: key);
@override
Widget build(BuildContext context) {
final settingProvider = Provider.of<SettingProvider>(context);
final userProvider = Provider.of<UserProvider>(context);
final menuProvider = Provider.of<ServiceLoanAvailabilityProvider>(context);
return LoadingManager(
isLoading: menuProvider.isLoading,
isFailedLoading: menuProvider.items == null,
stateCode: menuProvider.stateCode,
onRefresh: () async {
menuProvider.reset();
await menuProvider.getData(user: userProvider.user, host: settingProvider.host);
},
child: SingleStatusMenu(
initialStatus: initialValue,
statuses: menuProvider.items,
onSelect: onSelect,
));
}
}
Loading…
Cancel
Save