new server edits

merge-requests/22/head
MaximusAshraf 3 years ago
parent d256a27a21
commit 75fedf395e

@ -0,0 +1,138 @@
import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:http/http.dart' as http;
import 'package:http/http.dart';
class ApiManager {
ApiManager._();
final Map<String,String> _headers = {'Content-Type': 'application/json',};
static ApiManager instance = ApiManager._();
Future<http.Response> get(
String url,
{Map<String,String> headers,}
) async{
Uri _url = Uri.parse(url);
print(_url);
http.Response response = await http.get(_url,headers: headers);
if(response.body is! List){
final message = jsonDecode(response.body)["message"];
if(message != null && message.toString().isNotEmpty){
Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG);
}
}
return response;
}
Future<http.Response> post(
String url, {
Map<String,String> headers,
@required Map<String,dynamic> body,
}
) async{
headers ??= {};
headers.addAll(_headers);
Uri _url = Uri.parse(url);
print(_url);
print(headers);
print(json.encode(body));
var request = http.Request('POST', _url);
request.body = json.encode(body);
request.headers.addAll(headers);
http.StreamedResponse _streamedResponse = await request.send();
http.Response response = await http.Response.fromStream(_streamedResponse);
print(response.statusCode);
print(response.body);
if(response.body is! List){
final message = jsonDecode(response.body)["message"];
if(message != null && message.toString().isNotEmpty){
Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG);
}
}
return response;
}
Future<http.Response> put(
String url, {
Map<String,String> headers,
@required Map<String,dynamic> body,
}
) async{
headers ??= {};
headers.addAll(_headers);
Uri _url = Uri.parse(url);
print(_url);
print(headers);
print(json.encode(body));
var request = http.Request('PUT', _url);
request.body = json.encode(body);
request.headers.addAll(headers);
http.StreamedResponse streamedResponse = await request.send();
http.Response response = await http.Response.fromStream(streamedResponse);
print(response.statusCode);
print(response.body);
if(response.body is! List){
final message = jsonDecode(response.body)["message"];
if(message != null && message.toString().isNotEmpty){
Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG);
}
}
return response;
}
Future<http.Response> multiPart(
String url, {
Map<String,String> headers,
@required Map<String,String> body,
@required List<Future<MultipartFile>> files,
}) async{
Map<String,String> _headers = const {'Content-Type': 'multipart/form-data',};
headers ??= {};
headers.addAll(_headers);
Uri _url = Uri.parse(url);
print(_url);
print(_headers);
print(json.encode(body));
var request = http.MultipartRequest('POST', _url);
request.fields.addAll(body);
request.headers.addAll(_headers);
for (var element in files) {
request.files.add(await element);
}
//request.files.addAll(_files);
print(request.files);
http.StreamedResponse streamedResponse = await request.send();
http.Response response = await http.Response.fromStream(streamedResponse);
print(response.statusCode);
print(response.body);
if(response.body is! List){
final message = jsonDecode(response.body)["message"];
if(message != null && message.toString().isNotEmpty){
Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG);
}
}
return response;
}
}

@ -1,68 +1,85 @@
class URLs{
URLs._();
static const host2 = "http://194.163.164.213/atoms/api";
static const host1 = "http://194.163.164.213/atoms/api";
static const host1 = "http://109.123.243.118:9000";
static String _baseUrl = "$_host/mobile";
static String _host = host1;
set host(String value) => _host = value;
static String getFileUrl(String file) => file == null || file.isEmpty
? null : "$_host/attachment/$file";
// API Routes
static const login = "/handle/user/login"; // post
static const register = "/handle/create/user"; // post
static const updateProfile = "/update/user/profile"; // post
static const getHospitals = "/handle/return/all/clients"; // get
static const getDepartments = "/handle/return/all/departments"; // get
static const getEquipment = "/handle/return/all/client/equipments"; // get ?client=208051
static const getServiceRequests = "/return/user/calls"; // get
static get login => "$_baseUrl/MobileAuth/Login"; // post
static get register => "$_baseUrl/handle/create/user"; // post
static get updateProfile => "$_baseUrl/update/user/profile"; // post
static get getHospitals => "$_baseUrl/Customer/GetCustomers"; // get
static get getDepartments => "$_baseUrl/Customer/GetDepartmentLookup"; // get
static get getEquipment => "$_baseUrl/Asset/GetAssets"; // get ?client=208051
static get getModels => "$_baseUrl/ModelDefinition/GetModelDefinitionAsset"; // get ?client=2
// 08051
static get getServiceRequests => "$_baseUrl/CallRequest/GetCallRequests"; // get
static get getServiceRequestThrough => "$_baseUrl/Lookups/GetLookup?lookupEnum=603"; // get
static get getServiceRequestTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=604"; // get
static get getServiceRequestStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=503";
static const getPreventiveMaintenanceVisits = "/return/user/calibrations"; // get
static const updatePreventiveMaintenanceVisits = "/update/user/calibrations"; // get
static get getPreventiveMaintenanceVisits => "$_baseUrl/return/user/calibrations"; // get
static get updatePreventiveMaintenanceVisits => "$_baseUrl/Visit/UpdateVisits"; // get
static const getRegularVisits = "/return/user/ppm"; // get
static const updateRegularVisits = "/update/user/ppm"; // get
static get getRegularVisits => "$_baseUrl/Visit/GetVisits"; // get
static get updateRegularVisits => "$_baseUrl/Visit/UpdateVisits"; // get
static const getSingleServiceRequest = "/return/call/information"; // get
static const getNotifications = "/return/user/notification"; // get
static const getRecentNotifications = "/return/user/recent/notification"; // get
static const createRequest = "/handle/create/request"; // get
static const createReport = "/handle/create/report/issue"; // get
static const updateRequestDate = "/handle/update/request"; // get
static get getSingleServiceRequest => "$_baseUrl/return/call/information"; // get
static get getNotifications => "$_baseUrl/return/user/notification"; // get
static get getRecentNotifications => "$_baseUrl/return/user/recent/notification"; // get
static get createRequest => "$_baseUrl/CallRequest/AddCallRequest"; // get
static get createReport => "$_baseUrl/handle/create/report/issue"; // get
static get updateRequestDate => "$_baseUrl/handle/update/request"; // get
// service report
static const createServiceReport = "/handle/create/service/report"; // get
static const updateServiceReport = "/handle/update/service/report"; // get
static const getServiceReport = "/handle/view/service/report"; // get
static const createDuplicatedReport = "/handle/duplicate/request"; // get
static get createServiceReport => "$_baseUrl/handle/create/service/report"; // get
static get updateServiceReport => "$_baseUrl/handle/update/service/report"; // get
static get getServiceReport => "$_baseUrl/WorkOrder/GetWorkOrderById"; // get
static get createDuplicatedReport => "$_baseUrl/handle/duplicate/request"; // get
static const getServiceReportReasons = "/return/service/report/reasons"; // get
static const getServiceReportTypes = "/return/service/report/type"; // get
static const getServiceReportStatus = "/return/service/report/status"; // get
static const getServiceReportLastCalls = "/return/call/last/situation"; // get
static const getServiceTypes = "/return/service/type"; // get
static const getPartNumber = "/handle/return/all/parts"; // get
static const getServiceReportPriority = "/return/call/priority/list"; // get
static const getServiceReportDefectTypes = "/return/call/defect/type/list"; // get
static get getServiceReportReasons => "$_baseUrl/Lookups/GetLookup?lookupEnum=522"; // get
static get getServiceReportTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=34"; // get
static get getServiceReportStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=521"; // get
static get getServiceReportLastCalls => "$_baseUrl/Lookups/GetLookup?lookupEnum=520"; // get
static get getServiceTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=604"; // get
static get getPartNumber => "$_baseUrl/PartCatalog/GetPartAutoComplete"; // get
static get getServiceReportPriority => "$_baseUrl/Lookups/GetLookup?lookupEnum=602"; // get
static get getServiceReportDefectTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=601"; // get
//gas refill
static const getGasTypes = "/return/gas/refill/types"; // get
static const getGasCylinderSize = "/return/gas/refill/size/cylinder"; // get
static const getGasStatus = "/return/gas/refill/status"; // get
static const requestGasRefill = "/create/gas/refill"; // get
static const updateGasRefill = "/update/gas/refill/"; // get
static const getGasRefill = "/search/gas/refill"; // get
static get getGasTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=606"; // get
// todo check edits with backend
static get getGasCylinderSize => "$_baseUrl/Lookups/GetLookup?lookupEnum=608"; // get
static get getGasCylinderType => "$_baseUrl/Lookups/GetLookup?lookupEnum=607"; // get
static get getGasStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=609"; // get
static get requestGasRefill => "$_baseUrl/GazRefill/AddGazRefill"; // get
static get updateGasRefill => "$_baseUrl/GazRefill/UpdateGazRefill"; // get
static get getGasRefill => "$_baseUrl/GazRefill/GetGazRefills"; // get
//device transfer
static const requestDeviceTransfer = "/create/transfer/asset"; // get
static const updateDeviceTransfer = "/update/transfer/asset"; // get
static const getDeviceTransfer = "/search/transfer/asset"; // get
static get requestDeviceTransfer => "$_baseUrl/AssetTransfer/AddAssetTransfer"; // get
static get updateDeviceTransfer => "$_baseUrl/AssetTransfer/UpdateAssetTransfer"; // get
static get getDeviceTransfer => "$_baseUrl/AssetTransfer/GetAssetTransfers"; // get
// employee
static const getEmployees = "/return/assigned/employee"; // get
static get getEmployees => "$_baseUrl/Lookups/GetLookup?lookupEnum=33"; // get
static get getEngineers => "$_baseUrl/Account/GetUserByRoleValue?value=R-6"; // get
// pentry
static const getPentry = "/return/pentry/details"; // get
static const updatePentry = "/update/pentry/details"; // get
static const getPentryTaskStatus = "/return/pentry/task/status"; // get
static const getPentryVisitStatus = "/return/pentry/visit/status/list"; // get
static const getPentryStatus = "/return/pentry/status/list"; // get
static get getPentry => "$_baseUrl/return/pentry/details"; // get
static get updatePentry => "$_baseUrl/Visit/UpdateVisit"; // get
static get getPentryTaskStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=403"; // get
static get getPentryVisitStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=402"; // get
static get getPentryStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=401"; // get
// contacts
static const getPentryContacts = "/handle/return/all/contacts"; // get
static get getPentryContacts => "$_baseUrl/handle/return/all/contacts"; // get
}

@ -1,5 +1,6 @@
import 'dart:convert';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/department.dart';
import 'package:flutter/cupertino.dart';
@ -41,10 +42,11 @@ class DepartmentsProvider extends ChangeNotifier{
notifyListeners();
Response response;
try{
response = await get(
Uri.parse(host + URLs.getDepartments),
headers: {
"Content-Type":"application/json; charset=utf-8"
response = await ApiManager.instance.post(
URLs.getDepartments,
body: {
"pageSize":50,
// if(title != null && title.isNotEmpty) "name":title,
}
);
} catch(error) {
@ -56,7 +58,7 @@ class DepartmentsProvider extends ChangeNotifier{
stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List listJson = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", ""));
List listJson = json.decode(response.body)["data"];
departments = listJson.map((department) => Department.fromJson(department)).toList();
}
isLoading = false;

@ -1,7 +1,8 @@
import 'dart:convert';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart';
import 'package:test_sa/controllers/api_routes/http_status_manger.dart';
import 'package:test_sa/models/department.dart';
import 'package:test_sa/models/device/device_transfer.dart';
import 'package:test_sa/models/device/device.dart';
@ -74,19 +75,19 @@ class DeviceTransferProvider extends ChangeNotifier{
// return 200;
Response response;
try{
response = await get(
Uri.parse(
"$host${URLs.getDeviceTransfer}?uid=${user.id}"
"&token=${user.token}&page=${(items?.length ?? 0) ~/pageItemNumber}"
),
headers: {
"Content-Type":"application/json; charset=utf-8"
}
Map<String,dynamic> body = {};
body["pageNumber"] = (items?.length ?? 0) ~/pageItemNumber + 1;
body["pageSize"] = pageItemNumber;
response = await ApiManager.instance.post(
URLs.getDeviceTransfer,
body: body,
);
stateCode = response.statusCode;
if(stateCode >= 200 && stateCode < 300) {
// client's request was successfully received
List listJson = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", ""));
List listJson = json.decode(response.body)["data"];
List<DeviceTransfer> itemsPage = listJson.map(
(request) => DeviceTransfer.fromJson(request)).toList();
items ??= [];
@ -116,23 +117,22 @@ class DeviceTransferProvider extends ChangeNotifier{
@required DeviceTransfer model,
}) async {
Map<String,dynamic> body = {
"uid": user.id.toString(),
"token": user.token ?? "",
"serial_id": model.device.id ?? "",
"destination_client": model.receiver.client.id ?? "",
"destination_department": model.receiver.department.id ?? "",
// "uid": user.id.toString(),
// "token": user.token ?? "",
"assetId": model.device.id ?? "",
"destSiteId": model.receiver.client.id ?? "",
"destDepartmentId": model.receiver.department.id ?? "",
"senderSiteId": model.receiver.client.id ?? "",
};
Response response;
try{
response = await post(
Uri.parse(
host+URLs.requestDeviceTransfer),
body: body,
response = await ApiManager.instance.post(
URLs.requestDeviceTransfer,
body: body
);
stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {
if(items != null) {
items.insert(
@ -156,24 +156,58 @@ class DeviceTransferProvider extends ChangeNotifier{
@required String host,
@required User user,
@required bool isSender,
@required String requestId,
@required int requestId,
@required DeviceTransfer oldModel,
@required DeviceTransferInfo newModel,
}) async {
Map<String,dynamic> body = {
"uid": user.id.toString(),
"token": user.token ?? "",
"current_user": user.id ?? "",
"id": oldModel.id,
"assetId": oldModel.device.id ?? "",
"senderSiteId": oldModel.sender.client.id,
"destSiteId": oldModel.receiver.client.id,
"destDepartmentId": oldModel.receiver.department.id,
};
if(isSender){
body.addAll(
{
//"senderSiteId": newModel.client.id,
//"senderDepartmentId": newModel.department.id,
"senderAssignedEmployeeId": newModel.userId,
"senderMachineStatusId": newModel.status.id,
"senderComment": newModel.comment,
"senderWorkingHours": newModel.workingHours,
"senderTravelingHours": newModel.travelingHours,
"senderAttachmentName": "${DateTime.now().toIso8601String()}.png|${newModel.signature}",
}
);
}else{
body.addAll(
{
//"destSiteId": newModel.client.id,
//"destDepartmentId": newModel.department.id,
"receiverAssignedEmployeeId": newModel.userId,
"receiverMachineStatusId": newModel.status.id,
"receiverComment": newModel.comment,
"receiverWorkingHours": newModel.workingHours,
"receiverTravelingHours": newModel.travelingHours,
"receiverAttachmentName": "${DateTime.now().toIso8601String()}.png|${newModel.signature}",
}
);
}
body.addAll(newModel.toJson(isSender));
Response response;
try{
response = await post(
Uri.parse("$host${URLs.updateDeviceTransfer}/$requestId"),
body: body,
response = await ApiManager.instance.put(
URLs.updateDeviceTransfer,
body: body
);
// response = await post(
// Uri.parse("$host${URLs.updateDeviceTransfer}/$requestId"),
// body: body,
// );
stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {

@ -1,7 +1,9 @@
import 'dart:convert';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/device/device.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
import 'package:flutter/cupertino.dart';
import 'package:http/http.dart';
@ -41,7 +43,9 @@ class DevicesProvider extends ChangeNotifier{
Future<int> getEquipment ({
@required String host,
@required User user,
@required String hospitalId
@required int hospitalId,
String serialNumber,
String number,
}) async {
if(_loading == true)
return -2;
@ -49,10 +53,13 @@ class DevicesProvider extends ChangeNotifier{
notifyListeners();
Response response;
try{
response = await get(
Uri.parse(host + URLs.getEquipment+"?client=$hospitalId"),
headers: {
"Content-Type":"application/json; charset=utf-8"
response = await ApiManager.instance.post(
URLs.getEquipment,
body: {
"pageSize":50,
"siteId":hospitalId,
if(serialNumber?.isEmpty == false) "assetSerialNumber":serialNumber,
if(number?.isEmpty == false) "assetNo":number,
}
);
} catch(error) {
@ -64,7 +71,7 @@ class DevicesProvider extends ChangeNotifier{
_stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List equipmentListJson = json.decode(utf8.decode(response.bodyBytes));
List equipmentListJson = json.decode(response.body)["data"];
_devices = equipmentListJson.map((device) => Device.fromJson(device)).toList();
}
_loading = false;
@ -80,31 +87,70 @@ class DevicesProvider extends ChangeNotifier{
Future<List<Device>> getDevicesList ({
@required String host,
@required User user,
@required String hospitalId,
@required int hospitalId,
String serialNumber,
String number,
}) async {
Response response;
try{
response = await get(
Uri.parse("$host${URLs.getEquipment}?client=$hospitalId"
"${serialNumber?.isEmpty == false ? "&name=$serialNumber" :""}"
"${number?.isEmpty == false ? "&number=$number" : ""}"
),
response = await ApiManager.instance.post(
URLs.getEquipment,
body: {
"pageSize":50,
"siteId":hospitalId,
if(serialNumber?.isEmpty == false) "assetSerialNumber":serialNumber,
if(number?.isEmpty == false) "assetNo":number,
}
);
// response = await get(
// Uri.parse("$host${URLs.getEquipment}?siteId=$hospitalId"
// "${serialNumber?.isEmpty == false ? "&assetSerialNumber=$serialNumber" :""}"
// "${number?.isEmpty == false ? "&assetNo=$number" : ""}"
// ),
// );
List<Device> page = [];
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List categoriesListJson = json.decode(utf8.decode(response.bodyBytes));
page = categoriesListJson.map((device) => Device.fromJson(device)).toList();
List equipmentListJson = json.decode(response.body)["data"];
page = equipmentListJson.map((device) => Device.fromJson(device)).toList();
}
return page;
} catch(error) {
print(error);
return [];
}
}
Future<List<Lookup>> getModels({
String code,
}) async {
Response response;
try{
response = await ApiManager.instance.get(
URLs.getModels+"?code=$code",
);
List<Lookup> page = [];
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List categoriesListJson = json.decode(response.body)["data"];
page = categoriesListJson.map((json) =>
Lookup(
name: json["modelDefCode"],
id: json["id"],
value: json["id"],
)
).toList();
}
return page;
} catch(error) {
print(error);
return [];
}
}
/// 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
@ -113,7 +159,7 @@ class DevicesProvider extends ChangeNotifier{
Future<List<Device>> getDevicesListBySN ({
@required String host,
@required User user,
@required String hospitalId,
@required int hospitalId,
@required String sn
}) async {
Response response;

@ -1,7 +1,8 @@
import 'dart:convert';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart';
import 'package:test_sa/controllers/api_routes/http_status_manger.dart';
import 'package:test_sa/models/gas_refill/gas_refill_model.dart';
import 'package:test_sa/models/issue.dart';
import 'package:test_sa/models/service_report.dart';
@ -53,20 +54,19 @@ class GasRefillProvider extends ChangeNotifier{
return -2;
isLoading = true;
Response response;
try{
response = await get(
Uri.parse(
"$host${URLs.getGasRefill}?uid=${user.id}"
"&token=${user.token}&page=${(items?.length ?? 0) ~/pageItemNumber}"
),
headers: {
"Content-Type":"application/json; charset=utf-8"
}
Map<String,dynamic> body = {};
body["pageNumber"] = (items?.length ?? 0) ~/pageItemNumber + 1;
body["pageSize"] = pageItemNumber;
response = await ApiManager.instance.post(
URLs.getGasRefill,
body: body,
);
stateCode = response.statusCode;
if(stateCode >= 200 && stateCode < 300) {
// client's request was successfully received
List requestsListJson = json.decode(utf8.decode(response.bodyBytes));
List requestsListJson = json.decode(response.body)["data"];
List<GasRefillModel> itemsPage = requestsListJson.map(
(request) => GasRefillModel.fromJson(request)).toList();
items ??= [];
@ -77,11 +77,13 @@ class GasRefillProvider extends ChangeNotifier{
nextPage = false;
}
}
try{
isLoading = false;
notifyListeners();
return response.statusCode;
} catch(error) {
print(error);
isLoading = false;
stateCode = -1;
notifyListeners();
@ -98,39 +100,34 @@ class GasRefillProvider extends ChangeNotifier{
Map<String,dynamic> body = {
"uid": user.id.toString(),
"token": user.token ?? "",
"title": model.title ?? "",
"status": "0",//model.status.value.toString(),
"GazRefillNo": "GR-${DateTime.now().toString().split(" ").first}",
"status": model.status.toMap(),
};
body["details"] = jsonEncode(model.details.map((model) => {
"type": model.type.id?.toString(),
"size": model.cylinderSize?.id.toString(),
"requsted_qty": model.requestedQuantity.toString(),
}).toList());
body["gazRefillDetails"] = model.details.map((model) => {
"gasType": model.type.toMap(),
"cylinderSize": model.cylinderSize.toMap(),
"cylinderType": model.cylinderType.toMap(),
"requestedQty": model.requestedQuantity,
}).toList();
Response response;
try{
response = await post(
Uri.parse(
host+URLs.requestGasRefill),
body: body,
response = await ApiManager.instance.post(
URLs.requestGasRefill,
body: body
);
stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {
if(items != null) {
items.insert(
0,
GasRefillModel.fromJson(
json.decode(utf8.decode(response.bodyBytes))[0]
)
);
reset();
notifyListeners();
}
}
return response.statusCode;
} catch(error) {
print(error);
return -1;
}
@ -143,25 +140,29 @@ class GasRefillProvider extends ChangeNotifier{
@required GasRefillModel newModel,
}) async {
Map<String,dynamic> body = {
"uid": user.id.toString(),
"token": user.token ?? "",
"title": newModel.title ?? "",
"status": newModel.status.id.toString(),
"id":newModel.id,
"gazRefillNo": newModel.title ?? "",
"status": newModel.status.toMap(),
};
body["details"] = jsonEncode(newModel.details.map((model) => {
"type": model.type.id.toString(),
"size": model.cylinderSize.id.toString(),
"requsted_qty": model.requestedQuantity.toString(),
"deliverd_qty": model.deliveredQuantity.toString(),
}).toList());
body["gazRefillDetails"] = newModel.details.map((model) => {
"gasType": model.type.toMap(),
"cylinderSize": model.cylinderSize.toMap(),
"cylinderType": model.cylinderType.toMap(),
"requestedQty": model.requestedQuantity,
"deliverdQty": model.deliveredQuantity,
}).toList();
Response response;
try{
response = await post(
Uri.parse("$host${URLs.updateGasRefill}/${newModel.id}"),
body: body,
response = await ApiManager.instance.put(
URLs.updateGasRefill,
body: body
);
// response = await post(
// Uri.parse("$host${URLs.updateGasRefill}/${newModel.id}"),
// body: body,
// );
stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {

@ -1,5 +1,6 @@
import 'dart:convert';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/models/user.dart';
@ -55,20 +56,18 @@ class HospitalsProvider extends ChangeNotifier{
notifyListeners();
Response response;
try{
response = await get(
Uri.parse(
host + URLs.getHospitals
+ "?page=${(_hospitals?.length ?? 0) ~/pageItemNumber}"
+ ( title == null || title.isEmpty ? "" : "&name=$title" )
),
headers: {
"Content-Type":"application/json; charset=utf-8"
response = await ApiManager.instance.post(
URLs.getHospitals,
body: {
"pageNumber":(hospitals?.length ?? 0) ~/pageItemNumber + 1,
"pageSize":50,
if(title != null && title.isNotEmpty) "name":title,
}
);
_stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List categoriesListJson = json.decode(utf8.decode(response.bodyBytes));
List categoriesListJson = json.decode(response.body)["data"];
List<Hospital> _page = categoriesListJson.map((category) => Hospital.fromJson(category)).toList();
if(hospitals == null)
_hospitals = [];
@ -95,20 +94,26 @@ class HospitalsProvider extends ChangeNotifier{
Future<List<Hospital>> getHospitalsList ({String host,User user,String title}) async {
Response response;
try{
response = await get(
Uri.parse(host + URLs.getHospitals
+ ( title == null || title.isEmpty ? "" : "?name=$title" )),
headers: {
"Content-Type":"application/json; charset=utf-8"
response = await ApiManager.instance.post(
URLs.getHospitals,
body: {
"pageSize":50,
if(title != null && title.isNotEmpty) "name":title,
}
);
// response = await get(
// Uri.parse(host + URLs.getHospitals
// + ( title == null || title.isEmpty ? "" : "?name=$title" )),
// headers: {
// "Content-Type":"application/json; charset=utf-8"
// }
// );
_stateCode = response.statusCode;
List<Hospital> _page = [];
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List categoriesListJson = json.decode(utf8.decode(response.bodyBytes));
List categoriesListJson = json.decode(response.body)["data"];
_page = categoriesListJson.map((category) => Hospital.fromJson(category)).toList();
}
return _page;

@ -43,7 +43,7 @@ class NotificationsProvider extends ChangeNotifier{
Future<int> getNotifications ({
@required String host,
@required User user,
@required String hospitalId,
@required int hospitalId,
}) async {
if(isLoading == true)
return -2;

@ -1,5 +1,6 @@
import 'dart:convert';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/part.dart';
import 'package:test_sa/models/user.dart';
@ -55,16 +56,12 @@ class PartsProvider extends ChangeNotifier{
notifyListeners();
Response response;
try{
response = await get(
Uri.parse(
host + URLs.getPartNumber
+ "?page=${(_parts?.length ?? 0) ~/pageItemNumber}"
+ ( title == null || title.isEmpty ? "" : "&name=$title" )
),
headers: {
"Content-Type":"application/json; charset=utf-8"
}
);
response = await ApiManager.instance.post(
URLs.getPartNumber,
body: {
if(title != null && title.isNotEmpty)
"partName":title
});
_stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
@ -100,24 +97,21 @@ class PartsProvider extends ChangeNotifier{
Future<List<Part>> getPartsList ({String host,User user,String title}) async {
Response response;
try{
response = await get(
Uri.parse(
host + URLs.getPartNumber
+ ( title == null || title.isEmpty ? "" : "?name=$title" )
),
headers: {
"Content-Type":"application/json; charset=utf-8"
}
);
response = await ApiManager.instance.post(
URLs.getPartNumber,
body: {
if(title != null && title.isNotEmpty)
"partName":title
});
List<Part> _page = [];
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List categoriesListJson = json.decode(utf8.decode(response.bodyBytes));
List categoriesListJson = json.decode(response.body)["data"];
_page = categoriesListJson.map((part) => Part.fromJson(part)).toList();
}
return _page;
} catch(error) {
print(error);
return [];
}

@ -1,5 +1,6 @@
import 'dart:convert';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/user.dart';
import 'package:test_sa/models/visits/visit.dart';
@ -60,7 +61,7 @@ class PreventiveMaintenanceVisitsProvider extends ChangeNotifier{
+"?uid=${user.id}"
"&token=${user.token}"
"&page=${(visits?.length ?? 0) ~/pageItemNumber}"
+visitsSearch?.toSearchString() ?? ""
// +visitsSearch?.toMap() ?? ""
),
headers: {
"Content-Type":"application/json; charset=utf-8"
@ -104,24 +105,20 @@ class PreventiveMaintenanceVisitsProvider extends ChangeNotifier{
}) async {
Response response;
Map<String,String> body = group.toJson();
body["token"] = user.token ?? "";
body["uid"] = user.id;
// body["token"] = user.token ?? "";
// body["uid"] = user.id;
//userId = 397.toString(); // testing id to view data
try{
response = await post(
Uri.parse(
host+URLs.updatePreventiveMaintenanceVisits
),
body: body,
);
response = await ApiManager.instance.put(
URLs.updatePreventiveMaintenanceVisits, body: body);
stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
group.visits.forEach((visit) {
visit.status = group.status;
visit.actualDate = group.date.toString().split(" ").first;
});
// group.visits.forEach((visit) {
// visit.status = group.status;
// visit.actualDate = group.date.toString().split(" ").first;
// });
group.visits.clear();
notifyListeners();
}

@ -1,5 +1,6 @@
import 'dart:convert';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/pantry/pentry.dart';
import 'package:test_sa/models/user.dart';
@ -8,11 +9,12 @@ import 'package:test_sa/models/visits/visits_group.dart';
import 'package:test_sa/models/visits/visits_search.dart';
import 'package:flutter/cupertino.dart';
import 'package:http/http.dart';
import 'package:logger/logger.dart';
class RegularVisitsProvider extends ChangeNotifier{
// number of items call in each request
final pageItemNumber = 50;
final pageItemNumber = 20;
//reset provider data
void reset(){
@ -52,20 +54,19 @@ class RegularVisitsProvider extends ChangeNotifier{
if(isLoading == true)
return -2;
isLoading = true;
if(visits == null) notifyListeners();
Response response;
//userId = 397.toString(); // testing id to view data
try{
response = await get(
Uri.parse(
host+URLs.getRegularVisits
+"?uid=${user.id}"
"&token=${user.token}"
"&page=${(visits?.length ?? 0) ~/pageItemNumber}"
+visitsSearch?.toSearchString() ?? ""
),
headers: {
"Content-Type":"application/json; charset=utf-8"
}
Map<String,dynamic> body = {};
body.addAll(visitsSearch.toMap());
body["pageNumber"] = (visits?.length ?? 0) ~/pageItemNumber +1;
body["pageSize"] = pageItemNumber;
response = await ApiManager.instance.post(
URLs.getRegularVisits,
body: body,
);
} catch(error) {
isLoading = false;
@ -77,12 +78,11 @@ class RegularVisitsProvider extends ChangeNotifier{
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
try{
List requestsListJson = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", ""));
List requestsListJson = json.decode(response.body)["data"];
List<Visit> _visits = requestsListJson.map(
(request) => Visit.fromJson(request)
).toList();
if(visits == null)
visits = [];
visits ??= [];
visits.addAll(_visits);
if(_visits.length == pageItemNumber){
nextPage = true;
@ -90,12 +90,12 @@ class RegularVisitsProvider extends ChangeNotifier{
nextPage = false;
}
}catch(error){
Logger().e(error);
isLoading = false;
stateCode = -1;
notifyListeners();
return -1;
}
}
isLoading = false;
notifyListeners();
@ -113,13 +113,12 @@ class RegularVisitsProvider extends ChangeNotifier{
VisitsGroup group,
}) async {
Response response;
Map<String,String> body = group.toJson();
body["token"] = user.token ?? "";
body["uid"] = user.id;
//userId = 397.toString(); // testing id to view data
try{
response = await post(
Uri.parse(host+URLs.updateRegularVisits),
Map<String,dynamic> body = group.toJson();
response = await ApiManager.instance.post(
URLs.getRegularVisits,
body: body,
);
stateCode = response.statusCode;
@ -138,7 +137,7 @@ class RegularVisitsProvider extends ChangeNotifier{
}
}
Future<Pentry> getPently({String host,User user,String id}) async {
Future<Pentry> getPently({String host,User user,int id}) async {
Response response;
response = await get(
Uri.parse("$host${URLs.getPentry}/$id"),
@ -162,20 +161,29 @@ class RegularVisitsProvider extends ChangeNotifier{
}) async {
try{
Response response;
Map<String,String> body = pentry.toMap();
body["uid"] = user.id;
body["token"] = user.token;
response = await post(
Uri.parse(host+URLs.updatePentry + "/${visit.id}"),
body: body,
Map<String,dynamic> body = pentry.toMap(visit.id);
body["id"] = visit.id;
body["assetId"] = visit.deviceId;
// body["token"] = user.token;
// body["vChecklists"]?.addAll({});
// body["vCalibrationTools"]?.addAll({"visitId": visit.id,});
// body["vKits"]?.add({"visitId": visit.id,});
response = await ApiManager.instance.put(
URLs.updatePentry, body: body
);
// response = await post(
// Uri.parse(host+URLs.updatePentry + "/${visit.id}"),
// body: body,
// );
if(response.statusCode >= 200 && response.statusCode < 300) {
visit.status = pentry.ppmVisitStatus;
reset();//visit.status = pentry.ppmVisitStatus;
notifyListeners();
}
return response.statusCode;
} catch(error) {
print(error);
return -1;
}

@ -1,7 +1,8 @@
import 'dart:convert';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart';
import 'package:test_sa/controllers/api_routes/http_status_manger.dart';
import 'package:test_sa/models/issue.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/service_report.dart';
@ -51,36 +52,33 @@ class ServiceRequestsProvider extends ChangeNotifier{
Future<int> getRequests ({
@required String host,
@required User user,
@required String hospitalId,
@required int hospitalId,
}) async {
if(isLoading == true)
return -2;
isLoading = true;
if(serviceRequests == null) notifyListeners();
Response response;
try{
response = await get(
Uri.parse(
host+URLs.getServiceRequests
+"?uid=${user.id}"
+(hospitalId == null? "" :"&client_nid=$hospitalId")
+"&token=${user.token}"
"&page=${(serviceRequests?.length ?? 0) ~/pageItemNumber}"
+search?.toSearchString() ?? ""
),
headers: {
"Content-Type":"application/json; charset=utf-8"
}
Map<String,dynamic> body = {};
body.addAll(search.toMap());
body["pageNumber"] = (serviceRequests?.length ?? 0) ~/pageItemNumber + 1;
body["pageSize"] = pageItemNumber;
response = await ApiManager.instance.post(
URLs.getServiceRequests,
body: body,
);
stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List requestsListJson = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", ""));
List<ServiceRequest> _serviceRequestsPage = requestsListJson.map(
List requestsListJson = json.decode(response.body)["data"];
List<ServiceRequest> serviceRequestsPage = requestsListJson.map(
(request) => ServiceRequest.fromJson(request)).toList();
if(serviceRequests == null)
serviceRequests = [];
serviceRequests.addAll(_serviceRequestsPage);
if(_serviceRequestsPage.length == pageItemNumber){
serviceRequests ??= [];
serviceRequests.addAll(serviceRequestsPage);
if(serviceRequestsPage.length == pageItemNumber){
nextPage = true;
}else{
nextPage = false;
@ -91,6 +89,7 @@ class ServiceRequestsProvider extends ChangeNotifier{
return response.statusCode;
} catch(error) {
print(error);
isLoading = false;
stateCode = -1;
notifyListeners();
@ -144,26 +143,31 @@ class ServiceRequestsProvider extends ChangeNotifier{
}) async {
var body = {
"uid": user.id,
"token": user.token ?? "",
"sn_id": serviceRequest.deviceId ?? "",
"date": (DateTime.now().millisecondsSinceEpoch).toString(),
"client": user.hospital.id ?? '',
"complaint": serviceRequest.maintenanceIssue,
"image": json.encode(serviceRequest.devicePhotos),
"priority": (serviceRequest.priority?.id).toString(),
"defect_types": (serviceRequest.defectType?.id).toString(),
"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 ?? '',
"callComments": serviceRequest.maintenanceIssue,
"attachmentsCallRequest": serviceRequest.devicePhotos.map((e) => {"name":e}).toList(),
"priority": serviceRequest.priority.toMap(),
"defectType": serviceRequest.defectType.toMap(),
"typeofRequest":serviceRequest.type.toMap(),
"requestedThrough":serviceRequest.type.toMap(),
};
if(serviceRequest.audio != null){
body["audio"] = serviceRequest.audio;
body["voiceNote"] = serviceRequest.audio;
}
Response response;
try{
response = await post(
Uri.parse(
host+URLs.createRequest),
body: body,
response = await ApiManager.instance.post(
URLs.createRequest,
body: body
);
stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {
if(serviceRequests != null)
@ -178,6 +182,7 @@ class ServiceRequestsProvider extends ChangeNotifier{
return response.statusCode;
} catch(error) {
print(error);
return -1;
}
@ -232,7 +237,7 @@ class ServiceRequestsProvider extends ChangeNotifier{
);
stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {
request.engineerName = employee.label;
request.engineerName = employee.name;
notifyListeners();
}
return response.statusCode;
@ -385,20 +390,11 @@ class ServiceRequestsProvider extends ChangeNotifier{
@required User user,
@required Subtitle subtitle,
}) async {
String userData = '';
if(user != null){
userData += "&uid="+user.id;
userData += "&token="+user.token;
}
Response response;
try{
response = await get(
Uri.parse(
host+URLs.getServiceReport
+'?report_id=$reportId'
'$userData',)
response = await ApiManager.instance.get(
URLs.getServiceReport + "?workOrderId=$reportId",
);
}catch(error){

@ -1,5 +1,6 @@
import 'dart:convert';
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';
@ -7,7 +8,7 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart';
class EmployeesProvider extends ChangeNotifier{
class AssignedToProvider extends ChangeNotifier{
//reset provider data
void reset(){
@ -48,21 +49,20 @@ class EmployeesProvider extends ChangeNotifier{
notifyListeners();
Response response;
try{
response = await get(
Uri.parse(
host + URLs.getEmployees),
response = await ApiManager.instance.get(
URLs.getEmployees,
);
_stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List categoriesListJson = json.decode(utf8.decode(response.bodyBytes));
List categoriesListJson = json.decode(response.body)["data"];
_items = categoriesListJson.map((type) => Lookup.fromJson(type)).toList();
}
_loading = false;
notifyListeners();
return response.statusCode;
} catch(error) {
print(error);
_loading = false;
_stateCode = -1;
notifyListeners();

@ -0,0 +1,74 @@
import 'dart:convert';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/engineer.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart';
class EngineersProvider extends ChangeNotifier{
//reset provider data
void reset(){
_items = 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<Engineer> _items;
List<Engineer> get items => _items;
// 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.getEngineers,
);
_stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List categoriesListJson = json.decode(response.body);
_items = categoriesListJson.map((type) => Engineer.fromJson(type)).toList();
}
_loading = false;
notifyListeners();
return response.statusCode;
} catch(error) {
print(error);
_loading = false;
_stateCode = -1;
notifyListeners();
return -1;
}
}
}

@ -1,5 +1,6 @@
import 'dart:convert';
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';
@ -49,13 +50,13 @@ class GasCylinderSizesProvider extends ChangeNotifier{
notifyListeners();
Response response;
try{
response = await get(
Uri.parse(host + URLs.getGasCylinderSize),
response = await ApiManager.instance.get(
URLs.getGasCylinderSize,
);
_stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List categoriesListJson = json.decode(utf8.decode(response.bodyBytes));
List categoriesListJson = json.decode(response.body)["data"];
_items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList();
}
_loading = false;

@ -0,0 +1,74 @@
import 'dart:convert';
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';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart';
class GasCylinderTypesProvider extends ChangeNotifier{
//reset provider data
void reset(){
_items = null;
_loading = 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> _items;
List<Lookup> get items => _items;
// 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.getGasCylinderType,
);
_stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List categoriesListJson = json.decode(response.body)["data"];
_items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList();
}
_loading = false;
notifyListeners();
return response.statusCode;
} catch(error) {
_loading = false;
_stateCode = -1;
notifyListeners();
return -1;
}
}
}

@ -1,5 +1,6 @@
import 'dart:convert';
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';
@ -48,13 +49,13 @@ class GasStatusProvider extends ChangeNotifier{
notifyListeners();
Response response;
try{
response = await get(
Uri.parse(host + URLs.getGasStatus),
response = await ApiManager.instance.get(
URLs.getGasStatus,
);
_stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List categoriesListJson = json.decode(utf8.decode(response.bodyBytes));
List categoriesListJson = json.decode(response.body)["data"];
_items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList();
}
_loading = false;

@ -1,5 +1,6 @@
import 'dart:convert';
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';
@ -48,13 +49,13 @@ class GasTypesProvider extends ChangeNotifier{
notifyListeners();
Response response;
try{
response = await get(
Uri.parse(host + URLs.getGasTypes),
response = await ApiManager.instance.get(
URLs.getGasTypes,
);
_stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List categoriesListJson = json.decode(utf8.decode(response.bodyBytes));
List categoriesListJson = json.decode(response.body)["data"];
_items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList();
}
_loading = false;

@ -1,5 +1,6 @@
import 'dart:convert';
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';
@ -48,16 +49,15 @@ class PentryStatusProvider extends ChangeNotifier{
notifyListeners();
Response response;
try{
response = await get(
Uri.parse(
host + URLs.getPentryStatus),
response = await ApiManager.instance.get(
URLs.getPentryStatus,
);
_stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List listJson = json.decode(utf8.decode(response.bodyBytes));
_items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList();
List listJson = json.decode(response.body)["data"];
_items = listJson.map((type) => Lookup.fromJson(type)).toList();
}
_loading = false;
notifyListeners();

@ -1,5 +1,6 @@
import 'dart:convert';
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';
@ -48,16 +49,15 @@ class PentryTaskStatusProvider extends ChangeNotifier{
notifyListeners();
Response response;
try{
response = await get(
Uri.parse(
host + URLs.getPentryTaskStatus),
response = await ApiManager.instance.get(
URLs.getPentryTaskStatus,
);
_stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List categoriesListJson = json.decode(utf8.decode(response.bodyBytes));
_items = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList();
List categoriesListJson = json.decode(response.body)["data"];
_items = categoriesListJson.map((type) => Lookup.fromJson(type)).toList();
}
_loading = false;
notifyListeners();

@ -1,5 +1,6 @@
import 'dart:convert';
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';
@ -48,16 +49,15 @@ class PentryVisitStatusProvider extends ChangeNotifier{
notifyListeners();
Response response;
try{
response = await get(
Uri.parse(
host + URLs.getPentryVisitStatus),
response = await ApiManager.instance.get(
URLs.getPentryVisitStatus,
);
_stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List listJson = json.decode(utf8.decode(response.bodyBytes));
_items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList();
List listJson = json.decode(response.body)["data"];
_items = listJson.map((type) => Lookup.fromJson(type)).toList();
}
_loading = false;
notifyListeners();

@ -1,5 +1,6 @@
import 'dart:convert';
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';
@ -48,16 +49,14 @@ class ServiceRequestDefectTypesProvider extends ChangeNotifier{
notifyListeners();
Response response;
try{
response = await get(
Uri.parse(
host + URLs.getServiceReportDefectTypes),
response = await ApiManager.instance.get(
URLs.getServiceReportDefectTypes,
);
_stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List listJson = json.decode(utf8.decode(response.bodyBytes));
_items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList();
List listJson = json.decode(response.body)["data"];
_items = listJson.map((type) => Lookup.fromJson(type)).toList();
}
_loading = false;
notifyListeners();

@ -1,5 +1,6 @@
import 'dart:convert';
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';
@ -49,17 +50,21 @@ class ServiceReportLastCallsProvider extends ChangeNotifier{
notifyListeners();
Response response;
try{
response = await get(
Uri.parse(
host + URLs.getServiceReportLastCalls
+(serviceStatus == null ? "" : "?service_status=$serviceStatus")
),
// todo request new api from backend to make filter work
response = await ApiManager.instance.get(
URLs.getServiceReportLastCalls,
);
// response = await get(
// Uri.parse(
// URLs.getServiceReportLastCalls
// +(serviceStatus == null ? "" : "?service_status=$serviceStatus")
// ),
// );
_stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List categoriesListJson = json.decode(utf8.decode(response.bodyBytes));
_calls = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList();
List categoriesListJson = json.decode(response.body)["data"];
_calls = categoriesListJson.map((type) => Lookup.fromJson(type)).toList();
}
_loading = false;
notifyListeners();

@ -1,5 +1,6 @@
import 'dart:convert';
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';
@ -48,21 +49,21 @@ class ServiceRequestPriorityProvider extends ChangeNotifier{
notifyListeners();
Response response;
try{
response = await get(
Uri.parse(
host + URLs.getServiceReportPriority),
response = await ApiManager.instance.get(
URLs.getServiceReportPriority,
);
_stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List listJson = json.decode(utf8.decode(response.bodyBytes));
_items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList();
List listJson = json.decode(response.body)["data"];
_items = listJson.map((type) => Lookup.fromJson(type)).toList();
}
_loading = false;
notifyListeners();
return response.statusCode;
} catch(error) {
print(error);
_loading = false;
_stateCode = -1;
notifyListeners();

@ -1,5 +1,6 @@
import 'dart:convert';
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';
@ -48,15 +49,14 @@ class ServiceReportReasonsProvider extends ChangeNotifier{
notifyListeners();
Response response;
try{
response = await get(
Uri.parse(
host + URLs.getServiceReportReasons),
response = await ApiManager.instance.get(
URLs.getServiceReportReasons,
);
_stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List categoriesListJson = json.decode(utf8.decode(response.bodyBytes));
_reasons = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList();
List categoriesListJson = json.decode(response.body)["data"];
_reasons = categoriesListJson.map((type) => Lookup.fromJson(type)).toList();
}
_loading = false;
notifyListeners();

@ -1,5 +1,6 @@
import 'dart:convert';
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';
@ -48,15 +49,15 @@ class ServiceReportStatusProvider extends ChangeNotifier{
notifyListeners();
Response response;
try{
response = await get(
Uri.parse(
host + URLs.getServiceReportStatus),
response = await ApiManager.instance.get(
URLs.getServiceReportStatus,
);
_stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List categoriesListJson = json.decode(utf8.decode(response.bodyBytes));
_status = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList();
List categoriesListJson = json.decode(response.body)["data"];
_status = categoriesListJson.map((type) => Lookup.fromJson(type)).toList();
}
_loading = false;
notifyListeners();

@ -1,5 +1,6 @@
import 'dart:convert';
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';
@ -48,16 +49,14 @@ class ServiceReportTypesProvider extends ChangeNotifier{
notifyListeners();
Response response;
try{
response = await get(
Uri.parse(
host + URLs.getServiceReportTypes),
response = await ApiManager.instance.get(
URLs.getServiceReportTypes,
);
_stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List categoriesListJson = json.decode(utf8.decode(response.bodyBytes));
_types = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList();
List categoriesListJson = json.decode(response.body)["data"];
_types = categoriesListJson.map((type) => Lookup.fromJson(type)).toList();
}
_loading = false;
notifyListeners();

@ -1,5 +1,6 @@
import 'dart:convert';
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';
@ -48,16 +49,14 @@ class ServiceStatusProvider extends ChangeNotifier{
notifyListeners();
Response response;
try{
response = await get(
Uri.parse(
host + URLs.getServiceTypes),
response = await ApiManager.instance.get(
URLs.getServiceTypes,
);
_stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List categoriesListJson = json.decode(utf8.decode(response.bodyBytes));
_statuses = categoriesListJson.map((e) => Lookup.fromIntIdJson(e)).toList();
List categoriesListJson = json.decode(response.body)["data"];
_statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList();
}
_loading = false;

@ -0,0 +1,74 @@
import 'dart:convert';
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';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart';
class ServiceRequestStatusProvider 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.getServiceRequestStatus,
);
_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,74 @@
import 'dart:convert';
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';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart';
class ServiceRequestedThroughProvider 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.getServiceRequestThrough,
);
_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,74 @@
import 'dart:convert';
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';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart';
class ServiceRequestTypeProvider 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.getServiceRequestTypes,
);
_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;
}
}
}

@ -1,5 +1,7 @@
import 'dart:convert';
import 'package:fluttertoast/fluttertoast.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/user.dart';
import 'package:flutter/material.dart';
@ -48,22 +50,21 @@ class UserProvider extends ChangeNotifier{
notifyListeners();
Response response;
try{
response = await post(
Uri.parse(
host+URLs.login),
response = await ApiManager.instance.post(
URLs.login,
body: await user.toLoginJson(),
);
_loading = false;
if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
_user = User.fromJson(jsonDecode(utf8.decode(response.bodyBytes))[0]);
_user = User.fromJson(jsonDecode(response.body));
return response.statusCode;
}
notifyListeners();
return response.statusCode;
} catch(error) {
print(error);
_loading = false;
notifyListeners();
return -1;
@ -86,10 +87,9 @@ class UserProvider extends ChangeNotifier{
notifyListeners();
Response response;
try{
response = await post(
Uri.parse(
host+URLs.register),
body: await user.toRegisterJson()
response = await ApiManager.instance.post(
URLs.register,
body: await user.toLoginJson(),
);
} catch(error) {
_loading = false;
@ -134,10 +134,9 @@ class UserProvider extends ChangeNotifier{
if(user.phoneNumber != _user.phoneNumber)
jsonObject["phone"] = user.phoneNumber;
try{
response = await post(
Uri.parse(
host+URLs.updateProfile),
body: jsonObject
response = response = await ApiManager.instance.post(
URLs.login,
body: jsonObject,
);
} catch(error) {
_loading = false;

@ -7,14 +7,19 @@ import 'package:test_sa/controllers/providers/api/hospitals_provider.dart';
import 'package:test_sa/controllers/providers/api/notifications_provider.dart';
import 'package:test_sa/controllers/providers/api/regular_visits_provider.dart';
import 'package:test_sa/controllers/providers/api/service_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/employee/employee_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/employee/assigned_to_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/employee/engineers_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_type_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart';
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_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';
import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/pages/login.dart';
import 'package:test_sa/views/pages/register.dart';
@ -80,16 +85,21 @@ class MyApp extends StatelessWidget {
ChangeNotifierProvider(create: (_) => ServiceStatusProvider()),
ChangeNotifierProvider(create: (_) => ServiceReportLastCallsProvider()),
ChangeNotifierProvider(create: (_) => GasCylinderSizesProvider()),
ChangeNotifierProvider(create: (_) => GasCylinderTypesProvider()),
ChangeNotifierProvider(create: (_) => GasStatusProvider()),
ChangeNotifierProvider(create: (_) => GasTypesProvider()),
ChangeNotifierProvider(create: (_) => GasRefillProvider()),
ChangeNotifierProvider(create: (_) => DeviceTransferProvider()),
ChangeNotifierProvider(create: (_) => EmployeesProvider()),
ChangeNotifierProvider(create: (_) => AssignedToProvider()),
ChangeNotifierProvider(create: (_) => PentryTaskStatusProvider()),
ChangeNotifierProvider(create: (_) => PentryVisitStatusProvider()),
ChangeNotifierProvider(create: (_) => PentryStatusProvider()),
ChangeNotifierProvider(create: (_) => ServiceRequestPriorityProvider()),
ChangeNotifierProvider(create: (_) => ServiceRequestDefectTypesProvider()),
ChangeNotifierProvider(create: (_) => ServiceRequestTypeProvider()),
ChangeNotifierProvider(create: (_) => ServiceRequestedThroughProvider()),
ChangeNotifierProvider(create: (_) => ServiceRequestStatusProvider()),
ChangeNotifierProvider(create: (_) => EngineersProvider()),
],
child: GestureDetector(
onTap: () {

@ -1,5 +1,5 @@
class Department{
String id;
int id;
String name;
Department({
@ -9,8 +9,8 @@ class Department{
factory Department.fromJson(Map<String,dynamic> parsedJson){
return Department(
id: parsedJson["nid"] ?? parsedJson["id"],
name: parsedJson["dept_name"] ?? parsedJson["value"],
id: parsedJson["id"],
name: parsedJson["name"],
);
}
factory Department.fromDepartment(Department department){

@ -1,5 +1,5 @@
class Device{
String id;
int id;
String serialNumber;
String number;
String brand;
@ -27,11 +27,13 @@ class Device{
factory Device.fromJson(Map<String,dynamic> parsedJson){
return Device(
id: parsedJson["nid"] ?? parsedJson["id"],
serialNumber: parsedJson["sn"] ?? parsedJson["value"],
number: parsedJson["asset_no"],
brand: parsedJson["brand"].toString(),
model: parsedJson["model"].toString(),
id: parsedJson["id"],
serialNumber: parsedJson["assetSerialNo"],
number: parsedJson["assetNumber"],
brand: parsedJson["modelDefinition"] == null ? "" :
parsedJson["modelDefinition"]["manufacturerName"],
model: parsedJson["modelDefinition"] == null ? "" :
parsedJson["modelDefinition"]["modelName"],
productionDate: getDateFromString(parsedJson["production_date"]),
supplyDate: getDateFromString(parsedJson["supply_date "]),
installDate: getDateFromString(parsedJson["install_date "]),

@ -1,4 +1,5 @@
import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/department.dart';
import 'package:test_sa/models/device/device.dart';
import 'package:test_sa/models/device/device_transfer_info.dart';
@ -6,7 +7,7 @@ import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/models/lookup.dart';
class DeviceTransfer{
String id;
int id;
String userId;
String title;
Device device;
@ -41,13 +42,60 @@ class DeviceTransfer{
}
factory DeviceTransfer.fromJson(Map<String,dynamic> parsedJson){
print(parsedJson["id"],);
print(URLs.getFileUrl(parsedJson["senderAttachmentName"]),);
print(URLs.getFileUrl(parsedJson["receiverAttachmentName"]),);
return DeviceTransfer(
id: parsedJson["id"],
title: parsedJson["title"],
title: parsedJson["transferCode"],
userId: parsedJson["uid"],
device: Device.fromJson(parsedJson["eq_sn"]),
sender: DeviceTransferInfo.fromJson(parsedJson,"sender_"),
receiver: DeviceTransferInfo.fromJson(parsedJson,"receiver_"),
device: Device(
id: parsedJson["assetId"],
number: parsedJson["assetNumber"],
serialNumber: parsedJson["assetSerialNo"],
),
sender: DeviceTransferInfo(
travelingHours: parsedJson["senderTravelingHours"],
comment: parsedJson["senderComment"],
workingHours: parsedJson["senderWorkingHours"],
userId: parsedJson["senderAssignedEmployeeId"],
userName: parsedJson["senderAssignedEmployeeName"],
client: Hospital(
id: parsedJson["senderSiteId"],
name: parsedJson["senderSiteName"]
),
department: Department(
id: parsedJson["senderDepartmentId"],
name: parsedJson["senderDepartmentName"],
),
// todo add segnature
signature: URLs.getFileUrl(parsedJson["senderAttachmentName"]),
status: Lookup(
id: parsedJson["senderMachineStatusId"],
name: parsedJson["senderMachineStatusName"],
),
),
receiver: DeviceTransferInfo(
travelingHours: parsedJson["receiverTravelingHours"],
comment: parsedJson["receiverComment"],
workingHours: parsedJson["receiverWorkingHours"],
userId: parsedJson["receiverAssignedEmployeeId"],
userName: parsedJson["receiverAssignedEmployeeName"],
client: Hospital(
id: parsedJson["destSiteId"],
name: parsedJson["destSiteName"]
),
department: Department(
id: parsedJson["destDepartmentId"],
name: parsedJson["destDepartmentName"],
),
// todo add segnature
signature: URLs.getFileUrl(parsedJson["receiverAttachmentName"]),
status: Lookup(
id: parsedJson["receiverMachineStatusId"],
name: parsedJson["receiverMachineStatusName"],
),
),
);
}
}

@ -11,7 +11,7 @@ class DeviceTransferInfo{
Department department;
String workingHours;
String travelingHours;
String name;
String userName;
String signature;
Lookup status;
@ -20,7 +20,7 @@ class DeviceTransferInfo{
this.comment,
this.department,
this.client,
this.name,
this.userName,
this.travelingHours,
this.workingHours,
this.signature,
@ -47,7 +47,7 @@ class DeviceTransferInfo{
fromDetails(DeviceTransferInfo old,{bool withSignature = true}){
userId = old.userId;
name = old.name;
userName = old.userName;
client = Hospital.fromHospital(old.client);
department = Department.fromDepartment(old.department);
workingHours = old.workingHours;
@ -61,13 +61,22 @@ class DeviceTransferInfo{
return DeviceTransferInfo(
workingHours: parsedJson["${key}working_hours"],
travelingHours: parsedJson["${key}travel_hours"],
name: parsedJson["${key}name"],
userName: parsedJson["${key}name"],
signature: parsedJson["${key}image"],
userId: parsedJson["${key}id"],
comment: parsedJson["${key}comment"],
client: Hospital.fromJson(parsedJson["${key}client"]),
department: Department.fromJson(parsedJson["${key}department"]),
status: Lookup.fromJson(parsedJson["${key}status"]),
client: Hospital(
id: parsedJson["${key}SiteId"],
name: parsedJson["${key}SiteName"]
),
department: Department(
id: parsedJson["${key}DepartmentId"],
name: parsedJson["${key}DepartmentName"],
),
status: Lookup(
id: parsedJson["${key}status"],
name: parsedJson["${key}status"],
),
);
}
}

@ -0,0 +1,31 @@
class Engineer{
String id;
String name;
Engineer({
this.id,
this.name,
});
factory Engineer.fromJson(Map<String,dynamic> parsedJson){
return Engineer(
id: parsedJson["userId"],
name: parsedJson["userName"],
);
}
factory Engineer.fromEngineer(Engineer department){
return Engineer(
id: department?.id,
name: department?.name,
);
}
@override
bool operator == (Object other) =>
identical(this, other) || other is Engineer &&
id == other.id;
@override
int get hashCode => id.hashCode;
}

@ -3,12 +3,14 @@ import 'package:test_sa/models/lookup.dart';
class GasRefillDetails{
Lookup type;
Lookup cylinderSize;
int requestedQuantity;
int deliveredQuantity;
Lookup cylinderType;
double requestedQuantity;
double deliveredQuantity;
GasRefillDetails({
this.type,
this.cylinderSize,
this.cylinderType,
this.requestedQuantity,
this.deliveredQuantity,
});
@ -21,13 +23,11 @@ class GasRefillDetails{
}
factory GasRefillDetails.fromJson(Map<String,dynamic> parsedJson){
return GasRefillDetails(
type: Lookup.fromJson(parsedJson["type"]),
cylinderSize: Lookup.fromJson(parsedJson["size"]),
requestedQuantity: parsedJson["requsted_qty"] == null
? 0 : int.tryParse(parsedJson["requsted_qty"].toString()) ?? 0,
deliveredQuantity: parsedJson["deliverd_qty"] == null
? 0 : int.tryParse(parsedJson["deliverd_qty"].toString()) ?? 0,
type: Lookup.fromJson(parsedJson["gasType"]),
cylinderSize: Lookup.fromJson(parsedJson["cylinderSize"]),
cylinderType: Lookup.fromJson(parsedJson["cylinderType"]),
requestedQuantity: parsedJson["requestedQty"],
deliveredQuantity: parsedJson["deliverdQty"],
);
}
@ -35,6 +35,7 @@ class GasRefillDetails{
return GasRefillDetails(
type: Lookup.fromStatus(details.type),
cylinderSize:Lookup.fromStatus(details.cylinderSize),
cylinderType:Lookup.fromStatus(details.cylinderType),
requestedQuantity: details.requestedQuantity,
deliveredQuantity: details.deliveredQuantity,
);

@ -2,8 +2,8 @@ import 'package:test_sa/models/gas_refill/gas_refill_details.dart';
import 'package:test_sa/models/lookup.dart';
class GasRefillModel{
String id;
String userId;
int id;
//String userId;
String clientName;
String title;
Lookup status;
@ -11,7 +11,7 @@ class GasRefillModel{
GasRefillModel({
this.id,
this.userId,
//this.userId,
this.clientName,
this.title,
this.status,
@ -27,7 +27,7 @@ class GasRefillModel{
fromGasRefillModel(GasRefillModel model){
id = model.id;
userId = model.userId;
//userId = model.userId;
clientName = model.clientName;
title = model.title;
status = Lookup.fromStatus(model.status);
@ -36,15 +36,16 @@ class GasRefillModel{
factory GasRefillModel.fromJson(Map<String,dynamic> parsedJson){
List<GasRefillDetails> details = [];
if(parsedJson["details"] != null){
List list = parsedJson["details"];
if(parsedJson["gazRefillDetails"] != null){
List list = parsedJson["gazRefillDetails"];
details = list.map((e) => GasRefillDetails.fromJson(e)).toList();
}
return GasRefillModel(
id: parsedJson["id"],
userId: parsedJson["uid"],
title: parsedJson["title"],
clientName: parsedJson["client"],
//userId: parsedJson["uid"],
title: parsedJson["gazRefillNo"],
clientName: parsedJson["site"] == null ? null:
parsedJson["site"]["custName"],
status: Lookup.fromJson(parsedJson["status"]),
details: details,
);

@ -1,5 +1,5 @@
class Hospital{
String id;
int id;
String name;
Hospital({
@ -9,8 +9,8 @@ class Hospital{
factory Hospital.fromJson(Map<String,dynamic> parsedJson){
return Hospital(
id: parsedJson["nid"] ?? parsedJson["id"],
name: parsedJson["client_name"] ?? parsedJson["value"],
id: parsedJson["id"],
name: parsedJson["custName"],
);
}

@ -1,46 +1,66 @@
class Lookup{
final String label;
final String key;
//old name label
final String name;
// old name key
final int value;
final int id;
const Lookup({
this.label,
this.key,
this.name,
this.value,
this.id,
});
@override
bool operator == (Object other) =>
identical(this, other) || other is Lookup &&
key == other.key &&
id == other.id;
((value != null && value == other.value)
|| ( id != null && id == other.id )) ;
@override
int get hashCode => id.hashCode;
int get hashCode => id?.hashCode ?? value?.hashCode;
toMap(){
return {
"id": id,
"name": name,
"value": value
};
}
factory Lookup.fromStatus(Lookup old){
if(old == null) return null;
return Lookup(
label: old.label,
name: old.name,
id: old.id,
key: old.key,
value: old.value,
);
}
factory Lookup.fromJson(Map<String,dynamic> parsedJson){
if(parsedJson["id"] == null && parsedJson["uid"] == null) return null;
if(parsedJson == null) return null;
return Lookup(
label: parsedJson["value"],
id: parsedJson["id"] is int
? parsedJson["id"]
: int.tryParse(parsedJson["id"] ?? parsedJson["uid"]),
name: parsedJson["name"],
id: parsedJson["id"],
value: parsedJson["value"] ?? parsedJson["id"],
);
}
// factory Lookup.fromJson(Map<String,dynamic> parsedJson){
// if(parsedJson["id"] == null && parsedJson["uid"] == null) return null;
// return Lookup(
// name: parsedJson["value"],
// id: parsedJson["id"] is int
// ? parsedJson["id"]
// : int.tryParse(parsedJson["id"] ?? parsedJson["uid"]),
// );
// }
factory Lookup.fromIntIdJson(Map<String,dynamic> parsedJson){
return Lookup(
label: parsedJson["value"],
name: parsedJson["value"],
id: parsedJson["id"],
);
}

@ -1,26 +1,40 @@
import 'package:test_sa/models/lookup.dart';
class CalibrationTool{
int id;
Lookup assetsNumber;
DateTime dataOfTesting;
CalibrationTool({
this.id,
this.assetsNumber,
this.dataOfTesting,
});
Map<String, String> toMap() {
Map<String, dynamic> toMap(int visitId) {
return {
if(assetsNumber != null) 'assetsSN': (assetsNumber?.id).toString(),
if(dataOfTesting != null) 'dataOfTesting': (dataOfTesting.millisecondsSinceEpoch ~/ 1000).toString(),
"id":id,
"visitId": visitId,
if(assetsNumber != null) 'assetId': (assetsNumber?.id).toString(),
if(dataOfTesting != null) 'calibrationDateOfTesters': dataOfTesting.toIso8601String(),
};
}
factory CalibrationTool.fromMap(Map<String, dynamic> map) {
return CalibrationTool(
assetsNumber: Lookup.fromJson(map['assetsSN']),
dataOfTesting: map['dataOfTesting'] == null || map['dataOfTesting'] == "" ? null :
DateTime.fromMillisecondsSinceEpoch(int.tryParse(map['dataOfTesting']) * 1000),
assetsNumber: Lookup(id: map["assetId"],name: map['assetSerialNo']),
dataOfTesting: DateTime.tryParse(map['calibrationDateOfTesters'] ?? ""),
);
}
CalibrationTool copyWith({
Lookup assetsNumber,
DateTime dataOfTesting,
}) {
return CalibrationTool(
id: id,
assetsNumber: assetsNumber ?? this.assetsNumber,
dataOfTesting: dataOfTesting ?? this.dataOfTesting,
);
}
}

@ -4,7 +4,7 @@ class ContactTitle extends Lookup {
ContactTitle({
int id,
String label
}):super(id: id,label: label);
}):super(id: id,name: label);
factory ContactTitle.fromMap(Map<String,dynamic> parsedJson){
return ContactTitle(

@ -4,7 +4,7 @@ class ContactTitle extends Lookup {
ContactTitle({
int id,
String label
}):super(id: id,label: label);
}):super(id: id,name: label);
factory ContactTitle.fromMap(Map<String,dynamic> parsedJson){
return ContactTitle(

@ -1,5 +1,6 @@
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/pantry/calibration_tools.dart';
@ -13,6 +14,7 @@ class Pentry{
Lookup status;
TimerModel timer;
DateTime actualVisitDate;
DateTime expectedVisitDate;
String travelingHours;
String image;
File imageFile;
@ -20,6 +22,8 @@ class Pentry{
List<PPMCheckList> ppmCheckLists;
List<CalibrationTool> calibrationTools;
List<PMKit> pmKits;
String signature;
Uint8List localSignature;
Pentry({
this.travelingHours,
@ -27,16 +31,20 @@ class Pentry{
this.status,
this.ppmVisitStatus,
this.actualVisitDate,
this.expectedVisitDate,
this.image,
this.imageFile,
// this.contacts,
this.ppmCheckLists,
this.calibrationTools,
this.pmKits,
this.signature,
this.localSignature
});
bool validate(){
if(actualVisitDate == null) return false;
if(expectedVisitDate == null) return false;
if(timer == null && timer.endAt != null) return false;
if(ppmVisitStatus == null) return false;
//if(status == null) return false;
@ -44,18 +52,29 @@ class Pentry{
return true;
}
Map<String, String> toMap() {
Map<String, String> map = {};
map["visit_status"] = ppmVisitStatus?.id.toString();
if(status != null) map["pentry_status"] = status?.id.toString();
if(travelingHours != null) map["traveling_hours"] = travelingHours;
if(imageFile != null) map["file_attachement"] = base64Encode(imageFile.readAsBytesSync());
map["actual_date"] = (actualVisitDate.millisecondsSinceEpoch / 1000).toStringAsFixed(0);
Map<String, dynamic> toMap(int visitId) {
Map<String, dynamic> map = {};
map["visitStatusId"] = ppmVisitStatus?.id.toString();
if(status != null) map["visitStatusId"] = status?.id.toString();
if(travelingHours != null) map["travelingHours"] = travelingHours;
//if(imageFile != null) map["file_attachement"] = base64Encode(imageFile.readAsBytesSync());
map["actualDate"] = actualVisitDate.toIso8601String();
map["expectedDate"] = expectedVisitDate.toIso8601String();
if(timer != null){
map["start_date"] = (timer.startAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0);
map["end_date"] = ((timer.endAt ?? DateTime.now()).millisecondsSinceEpoch / 1000).toStringAsFixed(0);
map["working_hours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5);
map["startDate"] = timer.startAt.toIso8601String();
map["endDate"] = timer.endAt?.toIso8601String() ?? DateTime.now().toIso8601String();
map["workingHours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5);
}
if(imageFile !=null){
map["vAttachments"]=[
{
"attachmentName":(imageFile.path.split("/").last+base64Encode(imageFile.readAsBytesSync()))
}
];
}
// if(contacts?.isNotEmpty == true) {
// for(int i = 0;i<contacts.length;i++){
// contacts[i].toMap().forEach((key, value) {
@ -63,9 +82,10 @@ class Pentry{
// });
// }
// }
map["ppmCheckLists"] = jsonEncode(ppmCheckLists.map((e) => e.toMap()).toList());
map["calibrationTools"] = jsonEncode(calibrationTools.map((e) => e.toMap()).toList());
map["pmKits"] = jsonEncode(pmKits.map((e) => e.toMap()).toList());
map["vChecklists"] = ppmCheckLists.map((e) => e.toMap(visitId)).toList();
map["vCalibrationTools"] = calibrationTools.map((e) => e.toMap(visitId)).toList();
map["vKits"] = pmKits.map((e) => e.toMap(visitId)).toList();
map["signature"] = signature;
return map;
}
@ -78,44 +98,71 @@ class Pentry{
// }
List<PMKit> pmKits = [];
if(map['pmKits'] != null){
pmKits =(map['pmKits'] as List<dynamic>)
if(map['vKits'] != null){
pmKits =(map['vKits'] as List<dynamic>)
.map((e) => PMKit.fromMap(e as Map<String, dynamic>))
.toList();
}
List<PPMCheckList> ppmCheckLists = [];
if(map['ppmCheckLists'] != null){
ppmCheckLists =(map['ppmCheckLists'] as List<dynamic>)
if(map['vChecklists'] != null){
ppmCheckLists =(map['vChecklists'] as List<dynamic>)
.map((e) => PPMCheckList.fromMap(e as Map<String, dynamic>))
.toList();
}
List<CalibrationTool> calibrationTools = [];
if(map['calibrationTools'] != null){
calibrationTools =(map['calibrationTools'] as List<dynamic>)
if(map['vCalibrationTools'] != null){
calibrationTools =(map['vCalibrationTools'] as List<dynamic>)
.map((e) => CalibrationTool.fromMap(e as Map<String, dynamic>))
.toList();
}
return Pentry(
status: Lookup.fromJson(map["pentry_status"]),
ppmVisitStatus: Lookup.fromJson(map["visit_status"]),
actualVisitDate: getDate(map["actual_date"]),
travelingHours: map["traveling_hours"],
status: Lookup(id: map["taskStatusId"],name: map["taskStatusName"]),
ppmVisitStatus: Lookup(id: map["visitStatusId"],name: map["visitStatusName"]),
actualVisitDate: DateTime.tryParse(map["actualDate"] ?? ""),
expectedVisitDate: DateTime.tryParse(map["expectedDate"] ?? ""),
travelingHours: map["travelingHours"],
timer: TimerModel(
startAt: getDate(map["start_date"]),
endAt: getDate(map["end_date"]),
durationInSecond: (int.tryParse(map["working_hours"] ?? "") ?? 0) * 60 *60
startAt: DateTime.tryParse(map["startDate"] ?? ""),
endAt: DateTime.tryParse(map["endDate"] ?? ""),
durationInSecond: (int.tryParse(map["workingHours"] ?? "") ?? 0) * 60 *60
),
// contacts: contacts,
ppmCheckLists: ppmCheckLists,
calibrationTools: calibrationTools,
pmKits: pmKits,
signature: map["signature"],
);
}
static getDate(String date){
return date == null || date.isEmpty
? null : DateTime.fromMillisecondsSinceEpoch(int.tryParse(date) * 1000);
Pentry copyWith({
Lookup ppmVisitStatus,
Lookup status,
TimerModel timer,
DateTime actualVisitDate,
DateTime expectedVisitDate,
String travelingHours,
String image,
File imageFile,
List<PPMCheckList> ppmCheckLists,
List<CalibrationTool> calibrationTools,
List<PMKit> pmKits,
String signature
}) {
return Pentry(
ppmVisitStatus: ppmVisitStatus ?? this.ppmVisitStatus,
status: status ?? this.status,
timer: timer ?? this.timer,
actualVisitDate: actualVisitDate ?? this.actualVisitDate,
expectedVisitDate: expectedVisitDate ?? this.expectedVisitDate,
travelingHours: travelingHours ?? this.travelingHours,
image: image ?? this.image,
imageFile: imageFile ?? this.imageFile,
ppmCheckLists: ppmCheckLists ?? this.ppmCheckLists?.map((e) => e.copyWith())?.toList(),
calibrationTools: calibrationTools ?? this.calibrationTools?.map((e) => e.copyWith())?.toList(),
pmKits: pmKits ?? this.pmKits.map((e) => e.copyWith()).toList(),
signature: signature ?? this.signature
);
}
}

@ -1,6 +1,7 @@
import 'package:test_sa/models/lookup.dart';
class PMKit{
int id;
Lookup itemCode;
String itemName;
String preparationTimeFrame;
@ -10,6 +11,7 @@ class PMKit{
String quantityReserved;
PMKit({
this.id,
this.itemCode,
this.itemName,
this.preparationTimeFrame,
@ -19,21 +21,24 @@ class PMKit{
this.quantityReserved
});
Map<String, String> toMap() {
Map<String, dynamic> toMap(int visitId) {
return {
if(itemCode != null) 'itemCode': (itemCode?.id).toString(),
if(itemName != null) 'itemName': itemName,
if(preparationTimeFrame != null) 'preparationTimeFrame': preparationTimeFrame,
if(kitFrequencyDemand != null) 'kitFrequencyDemand': kitFrequencyDemand,
if(availability != null) 'availability': availability,
if(quantityNeeded != null) 'quantityNeeded': quantityNeeded,
if(quantityReserved != null) 'quantityReserved': quantityReserved,
"id":id,
"visitId": visitId,
if(itemCode != null) 'partCatalogItemId': (itemCode?.id).toString(),
// if(itemName != null) 'itemName': itemName,
// if(preparationTimeFrame != null) 'preparationTimeFrame': preparationTimeFrame,
// if(kitFrequencyDemand != null) 'kitFrequencyDemand': kitFrequencyDemand,
// if(availability != null) 'availability': availability,
// if(quantityNeeded != null) 'quantityNeeded': quantityNeeded,
// if(quantityReserved != null) 'quantityReserved': quantityReserved,
};
}
factory PMKit.fromMap(Map<String, dynamic> map) {
return PMKit(
itemCode: Lookup.fromJson(map['itemCode']),
id: map['id'],
//itemCode: Lookup.fromJson(map['itemCode']),
itemName: map['itemName'] as String,
preparationTimeFrame: map['preparationTimeFrame'] as String,
kitFrequencyDemand: map['kitFrequencyDemand'] as String,
@ -42,4 +47,26 @@ class PMKit{
quantityReserved: map['quantityReserved'] as String,
);
}
PMKit copyWith({
int id,
Lookup itemCode,
String itemName,
String preparationTimeFrame,
String kitFrequencyDemand,
String availability,
String quantityNeeded,
String quantityReserved,
}) {
return PMKit(
id: id ?? this.id,
itemCode: itemCode ?? this.itemCode,
itemName: itemName ?? this.itemName,
preparationTimeFrame: preparationTimeFrame ?? this.preparationTimeFrame,
kitFrequencyDemand: kitFrequencyDemand ?? this.kitFrequencyDemand,
availability: availability ?? this.availability,
quantityNeeded: quantityNeeded ?? this.quantityNeeded,
quantityReserved: quantityReserved ?? this.quantityReserved,
);
}
}

@ -1,33 +1,54 @@
import 'package:test_sa/models/lookup.dart';
class PPMCheckList{
int id;
Lookup status;
String title;
String comment;
String measuredValue;
PPMCheckList({
this.id,
this.title,
this.status,
this.comment,
this.measuredValue,
});
Map<String, String> toMap() {
Map<String, dynamic> toMap(int visitId) {
return {
if(status != null) 'status': status?.id.toString(),
if(title != null) 'title': title,
if(comment != null) 'comment': comment,
'id': id,
"visitId": visitId,
if(status != null) 'taskStatusId': status?.id.toString(),
if(title != null) 'task': title,
if(comment != null) 'taskComment': comment,
if(measuredValue != null) 'measuredValue': measuredValue,
};
}
factory PPMCheckList.fromMap(Map<String, dynamic> map) {
return PPMCheckList(
status: Lookup.fromJson(map['status']),
title: map['title'] as String,
comment: map['comment'] as String,
id: map['id'] as int,
status: Lookup(id: map["taskStatusId"],name: map["taskStatusName"]),
title: map['task'] as String,
comment: map['taskComment'] as String,
measuredValue: map['measuredValue'] as String,
);
}
PPMCheckList copyWith({
int id,
Lookup status,
String title,
String comment,
String measuredValue,
}) {
return PPMCheckList(
id: id ?? this.id,
status: status ?? this.status,
title: title ?? this.title,
comment: comment ?? this.comment,
measuredValue: measuredValue ?? this.measuredValue,
);
}
}

@ -1,5 +1,5 @@
class Part{
String id;
int id;
String code;
String name;
int quantity;
@ -13,11 +13,11 @@ class Part{
factory Part.fromJson(Map<String,dynamic> parsedJson){
return Part(
id: parsedJson["nid"] ?? parsedJson["id"],
code: parsedJson["part_code"] ?? parsedJson["name"],
name: parsedJson["part_name"],
quantity: parsedJson["qty"] == null
? 1 : int.tryParse(parsedJson["qty"].toString()) ?? 1,
id: parsedJson["id"],
code: parsedJson["partNo"],
name: parsedJson["partName"],
quantity: parsedJson["partQuantity"] == null
? 1 : int.tryParse(parsedJson["partQuantity"].toString()) ?? 1,
);
}
}

@ -52,12 +52,12 @@ class ServiceReport {
this.timer,
});
Map<String,String> toMap(){
Map<String,dynamic> toMap(){
Map<String,String> _map = {};
if(id != null) _map["id"] = id;
if(visitDate != null) _map["visit_date"] = (visitDate.millisecondsSinceEpoch ~/ 1000).toString();
if(serviceType != null) _map["service_type"] = serviceType.id.toString();
if(status != null) _map["status"] = status.id.toString();
if(status != null) _map["status"] = status.toMap();
if(type != null) _map["service_report_type"] = type.id.toString();
if(faultDescription != null && faultDescription.isNotEmpty) _map["fault_description"] = faultDescription;
//if(workHours != null && workHours.isNotEmpty) _map["working_hours"] = workHours;
@ -71,18 +71,18 @@ class ServiceReport {
if(jobSheetNumber != null && jobSheetNumber.isNotEmpty) _map["job_sheet_no"] = jobSheetNumber;
if(parts != null && parts.isNotEmpty){
Map<String,int> _partsMap = {};
parts.forEach((part) {
if(part.id.isNotEmpty)
_partsMap[part.id] = part.quantity;
});
// parts.forEach((part) {
// if(part.id == null)
// _partsMap[part.id] = part.quantity;
// });
_map["parts"] = json.encode(_partsMap);
}
if(device?.id != null && device.id != null) _map["eq_id"] = device.id;
//if(device?.id != null && device.id != null) _map["eq_id"] = device.id;
if(quantity != null && quantity.isNotEmpty) _map["qty"] = quantity;
if(endDate != null) _map["end_date"] = (endDate.millisecondsSinceEpoch ~/ 1000).toString();
if(reason != null) _map["reasons"] = reason.id.toString();
if(reason != null) _map["reasons"] = reason.toMap();
if(operatingHours != null && operatingHours.isNotEmpty) _map["operation_hours"] = operatingHours;
if(callLastSituation != null) _map["call_last_situtation"] = callLastSituation.id.toString();
if(callLastSituation != null) _map["calllastSituation"] = callLastSituation.id.toString();
if(image != null) _map["image"] = image;
if(invoiceCode != null) _map["invoice_no"] = invoiceCode;
if(invoiceNumber != null) _map["invoice_code"] = invoiceNumber;
@ -102,7 +102,8 @@ class ServiceReport {
if(parts == null) return false;
//if(endDate == null) return false;
//if(reason == null) return false;
if((device?.id == null || device.id.isEmpty) && type?.id != 1) return false;
//todo uncoment this line
//if((device?.id == null || device.id.isEmpty) && type?.id != 1) return false;
//if(quantity == null || quantity.isEmpty) return false;
//if(image == null) return false;
return true;

@ -1,3 +1,4 @@
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/lookup.dart';
import '../timer_model.dart';
@ -6,13 +7,13 @@ class ServiceRequest{
String id;
String requestCode;
String deviceSerialNumber;
String deviceId;
int deviceId;
String deviceArName;
String deviceEnName;
List<String> devicePhotos;
String maintenanceIssue;
String hospitalName;
String hospitalId;
int hospitalId;
String departmentName;
String engineerName;
String date;
@ -32,6 +33,8 @@ class ServiceRequest{
String deviceNumber;
Lookup priority;
Lookup defectType;
Lookup type;
Lookup requestedThrough;
ServiceRequest({
this.id,
@ -63,42 +66,48 @@ class ServiceRequest{
this.defectType,
this.priority,
this.deviceNumber,
this.type,
this.requestedThrough,
});
factory ServiceRequest.fromJson(Map<String,dynamic> parsedJson){
List<String> images = [];
if(parsedJson["attachmentsCallRequest"] is List){
List list = parsedJson["attachmentsCallRequest"];
images = list.map((e) => URLs.getFileUrl(e["attachmentsCallRequest"])).toList();
}
return ServiceRequest(
id: parsedJson["nid"],
requestCode: parsedJson["call_id"] ?? parsedJson["jobcode"] ,
hospitalName: parsedJson["call_client"],
deviceNumber: parsedJson["device_no"],
deviceId: parsedJson["deviceid"],
audio: parsedJson["audio"] ?? "",
deviceArName: parsedJson["equipment_arabic_name"] == false
? "No Name found" : parsedJson["equipment_arabic_name"],
deviceEnName: parsedJson["equipment_english_name"] == false
? "No Name found" : parsedJson["equipment_english_name"],
devicePhotos: List<String>.from(parsedJson["image"]),
deviceSerialNumber: parsedJson["call_sn"],
date: parsedJson["call_data"],
maintenanceIssue: parsedJson["call_complaint"] ?? parsedJson["complaint"],
statusLabel: parsedJson["status_value"],
statusValue: int.tryParse(parsedJson["status"]??"-1"),
departmentName: parsedJson["department_name"],
engineerName: parsedJson["employee_name"],
hospitalId: parsedJson["client"],
reportID: parsedJson["service_report_nid"] is String
? parsedJson["service_report_nid"]
: null ,
viewReport: parsedJson["service_report_nid"] is bool ? false : true,
deviceModel: parsedJson["device_model"],
engineerMobile: parsedJson["engineer_mobile"],
faultDescription: parsedJson["fault_desc"],
jobSheetNumber: parsedJson["job_sheet_number"],
visitDate: parsedJson["visit_date"],
nextVisitDate:parsedJson["next_visit_date"] == null
? null : DateTime.fromMillisecondsSinceEpoch(int.tryParse(parsedJson["next_visit_date"]) * 1000),
workPerformed: parsedJson["work_performed"],
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"]["id"].toString(),
viewReport: parsedJson["workOrder"] != null,
deviceModel: parsedJson["asset"]["modelDefinition"]["modelName"],
engineerMobile: parsedJson["assignedEmployee"] == null ? null :
parsedJson["assignedEmployee"]["phone"],
faultDescription: parsedJson["workOrder"]["faultDescription"],
jobSheetNumber: parsedJson["workOrder"]["jobSheetNumber"],
visitDate: DateTime.tryParse(parsedJson["visitDate"] ?? "").toString().split(" ").first,
nextVisitDate: DateTime.tryParse(parsedJson["nextVisitDate"] ?? ""),
workPerformed: parsedJson["workOrder"]["workPerformed"],
);
}
}

@ -1,13 +1,18 @@
import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/models/lookup.dart';
class ServiceRequestSearch{
String deviceSerialNumber;
String deviceNumber;
String deviceName;
String hospital;
Hospital hospital;
String model;
int statusValue;
Lookup statusValue;
ServiceRequestSearch({
this.deviceSerialNumber,
this.deviceNumber,
this.statusValue,
this.deviceName,
this.model,
@ -16,31 +21,38 @@ class ServiceRequestSearch{
fromSearch(ServiceRequestSearch newSearch){
deviceSerialNumber = newSearch.deviceSerialNumber;
deviceNumber = newSearch.deviceNumber;
statusValue = newSearch.statusValue;
hospital = newSearch.hospital;
model = newSearch.model;
}
String toSearchString(){
String _search = "";
Map<String,dynamic> toMap(){
Map<String,dynamic> search = {};
if(deviceSerialNumber != null && deviceSerialNumber.isNotEmpty){
_search += "&sn_id=$deviceSerialNumber";
search["assetSerialNumber"] = deviceSerialNumber;
}
if(deviceNumber != null && deviceNumber.isNotEmpty){
search["assetNo"] = deviceNumber;
}
if(statusValue != null){
_search += "&status=$statusValue";
search["status"] = statusValue.toMap();
}
if(deviceName != null && deviceName.isNotEmpty){
_search += "&equipment_en_name=$deviceName";
search["assetName"] = deviceName;
}
if(hospital != null && hospital.isNotEmpty){
_search += "&client=$hospital";
if(hospital != null){
search["site"] = hospital.name;
}
if(model != null && model.isNotEmpty){
_search += "&model=$model";
if(model != null){
search["modelDefinition"] = model;
}
return _search;
return search;
}
}

@ -8,7 +8,6 @@ class User{
String userName;
String password;
String email;
String image;
Hospital hospital;
Department department;
UsersTypes type;
@ -16,6 +15,7 @@ class User{
String whatsApp;
String token;
bool isActive;
DateTime tokenLife;
User({
@ -25,11 +25,11 @@ class User{
this.password = "",
this.phoneNumber = "",
this.hospital,
this.image,
this.department,
this.type,
this.whatsApp,
this.token,
this.tokenLife,
this.isActive = false
});
@ -38,14 +38,14 @@ class User{
await FirebaseNotificationManger.getToken();
return {
"username":userName,
"pass":password,
"password":password,
"firebase_token": FirebaseNotificationManger?.token ?? "",
};
}
Map<String,dynamic> toUpdateProfileJson(){
Map<String,dynamic> jsonObject ={};
if(department?.id != null && department.id.isNotEmpty)
if(department?.id != null)
jsonObject["department"] = department.id;
if(whatsApp != null && whatsApp.isNotEmpty)
jsonObject["whatsapp"] = whatsApp;
@ -71,48 +71,52 @@ class User{
Map<String,dynamic> toJson(){
return {
"uid":id,
"name": userName,
"userID":id,
"username": userName,
"email":email,
"token":token,
"phone":phoneNumber,
"phoneNumber":phoneNumber,
"whatsapp":whatsApp,
"client":hospital?.id,
"client_id":hospital?.id,
"client_name":hospital?.name,
"department":department?.id,
"department_id":department?.id,
"department_name":department?.name,
"password":password,
"picture":image,
"active":isActive ? 1 : 0,
"role": type == UsersTypes.engineer
? "field_engineer" : "normal_user" ,
//"password":password,
"tokenlife":tokenLife.toIso8601String(),
"active":isActive,
"userRoles": type == UsersTypes.engineer
? "value: R-6" : "value: R-5" ,
// "token":token, pass is token
};
}
factory User.fromJson(Map<String,dynamic> parsedJson){
UsersTypes type;
switch(parsedJson["role"]){
case "field_engineer": type = UsersTypes.engineer; break;
default: type = UsersTypes.normal_user; break;
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;
}
print(parsedJson);
return User(
id: parsedJson["uid"],
userName: parsedJson["name"] ?? parsedJson["title"],
email: parsedJson["mail"] ?? parsedJson["email"],
hospital: Hospital(
id: parsedJson["client"],
name: parsedJson["client_name"]
),
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: parsedJson["department_id"],
name: parsedJson["department_name"],
),
image: parsedJson["picture"],
phoneNumber: parsedJson["phone"],
whatsApp: parsedJson["whatsapp"],
phoneNumber: parsedJson["phoneNumber"],
whatsApp: parsedJson["phoneNumber"],
token: parsedJson["token"],
isActive: parsedJson["active"] == "1",
isActive: parsedJson["isAuthenticated"],
tokenLife: DateTime.tryParse(parsedJson["tokenlife"]??""),
type:type
);
}

@ -1,21 +1,22 @@
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/pantry/pentry.dart';
import 'package:test_sa/models/timer_model.dart';
class Visit{
String id;
int id;
String serialNumber;
String expectDate;
String actualDate;
String hospitalId;
int hospitalId;
String hospitalName;
String deviceId;
int deviceId;
String deviceSerialNumber;
String deviceArabicName;
String deviceEnglishName;
String employId;
String employName;
String modelAndBrand;
String contactStatus;
Pentry pentry;
Lookup status;
String assignTo;
String deviceNumber;
@ -36,35 +37,41 @@ class Visit{
this.actualDate,
this.status,
this.modelAndBrand,
this.contactStatus,
this.pentry,
this.images,
this.assignTo,
this.deviceNumber,
});
factory Visit.fromJson(Map<String,dynamic> parsedJson){
List<String> images = [];
if(parsedJson["vAttachments"] is List){
List list = parsedJson["vAttachments"];
images = list.map((e) => e["attachmentURL"].toString()).toList();
}
return Visit(
id: parsedJson["nid"],
serialNumber: parsedJson["title"],
hospitalId: parsedJson["client"],
deviceNumber: parsedJson["device_no"],
hospitalName: parsedJson["client_name"],
deviceId: parsedJson["medical_equipment_nid"],
deviceSerialNumber: parsedJson["medical_equipment"],
deviceEnglishName: parsedJson["equipment_english_name"],
deviceArabicName: parsedJson["equipment_arabic_name"],
employId: parsedJson["assigned_employee"],
employName: parsedJson["assigned_employee_name"],
expectDate: parsedJson["expected_date"],
actualDate: parsedJson["actual_date"],
modelAndBrand: parsedJson["mode_brand"],
contactStatus: parsedJson["contactStatus"],
images: List<String>.from(parsedJson["images"] ?? []),
id: parsedJson["id"],
serialNumber: parsedJson["visitCode"],
hospitalId: parsedJson["siteId"],
deviceNumber: parsedJson["assetNumber"],
hospitalName: parsedJson["siteName"],
deviceId: parsedJson["assetId"],
deviceSerialNumber: parsedJson["assetSerialNo"],
deviceEnglishName: parsedJson["assetName"],
deviceArabicName: parsedJson["assetName"],
employId: parsedJson["assignedToId"].toString(),
employName: parsedJson["assignedToName"],
expectDate: parsedJson["expectedDate"].toString().split("T").first,
actualDate: parsedJson["actualDate"].toString().split("T").first,
modelAndBrand: "${parsedJson["modelName"]} / ${parsedJson["manufacturerName"]}",
// contactStatus: parsedJson["contactStatus"],
images: images,
status: Lookup(
id: int.tryParse(parsedJson["status"] ?? "-1"), // actual value (0,1,2)
label: parsedJson["status_value"] // text value
id: parsedJson["visitStatusId"], // actual value (0,1,2)
name: parsedJson["visitStatusName"] // text value
),
assignTo: parsedJson["assigned_to"],
assignTo: parsedJson["assignedToName"],
pentry: Pentry.fromMap(parsedJson)
);
}
}

@ -1,43 +1,47 @@
import 'package:test_sa/models/engineer.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/visits/visit.dart';
class VisitsGroup{
String userId;
String workingHours;
String travelingHours;
String jobSheetNumber;
String image;
Lookup status;
Lookup taskStatus;
DateTime date;
// String userId;
// String workingHours;
// String travelingHours;
// String jobSheetNumber;
// String image;
// Lookup status;
// Lookup taskStatus;
// DateTime date;
Engineer engineer;
List<Visit> visits;
VisitsGroup({
this.userId,
this.status,
this.date,
this.jobSheetNumber,
this.travelingHours,
this.workingHours,
// this.userId,
// this.status,
// this.date,
// this.jobSheetNumber,
// this.travelingHours,
// this.workingHours,
this.visits,
this.image,
this.taskStatus,
this.engineer,
// this.image,
// this.taskStatus,
});
Map<String,String> toJson(){
Map<String,String> jsonObject = {};
jsonObject["nids"] = visits.map((e) => e.id).toList().join(',');
if(status != null) jsonObject["status"] = status.id.toString();
if(date != null) jsonObject["date"] = date.toString().split(" ").first;
if(jobSheetNumber != null && jobSheetNumber.isNotEmpty)
jsonObject["job_sheet_no"] = jobSheetNumber;
if(travelingHours != null && travelingHours.isNotEmpty)
jsonObject["traveling_hours"] = travelingHours;
if(workingHours != null && workingHours.isNotEmpty)
jsonObject["working_hours"] = workingHours;
if(image != null) jsonObject["image"] = image;
if(taskStatus != null) jsonObject["task_status"] = taskStatus.id.toString();
Map<String,dynamic> toJson(){
Map<String,dynamic> jsonObject = {};
jsonObject["ids"] = visits.map((e) => e.id).toList();
jsonObject["assignedEmployeeId"] = engineer?.id;
// if(status != null) jsonObject["taskStatusId"] = status.id.toString();
// if(date != null) jsonObject["actualDate"] = date.toIso8601String();
// if(jobSheetNumber != null && jobSheetNumber.isNotEmpty)
// jsonObject["jobSheetNo"] = jobSheetNumber;
// if(travelingHours != null && travelingHours.isNotEmpty)
// jsonObject["travelingHours"] = travelingHours;
// if(workingHours != null && workingHours.isNotEmpty)
// jsonObject["workingHours"] = workingHours;
// if(image != null) jsonObject["image"] = image;
// if(taskStatus != null) jsonObject["task_status"] = taskStatus.id.toString();
return jsonObject;
}

@ -1,20 +1,23 @@
import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/models/lookup.dart';
class VisitsSearch{
String deviceSerialNumber;
String hospitalName;
Hospital hospital;
String brand;
String model;
String contactStatus;
Lookup model;
Lookup contactStatus;
DateTime expectedDateFrom;
DateTime expectedDateTo;
DateTime actualDateFrom;
DateTime actualDateTo;
int statusValue;
Lookup statusValue;
VisitsSearch({
this.deviceSerialNumber,
this.statusValue,
this.brand,
this.hospitalName,
this.hospital,
this.actualDateTo,
this.actualDateFrom,
this.model,
@ -26,7 +29,7 @@ class VisitsSearch{
fromSearch(VisitsSearch newSearch){
deviceSerialNumber = newSearch.deviceSerialNumber;
brand = newSearch.brand;
hospitalName = newSearch.hospitalName;
hospital = newSearch.hospital;
actualDateTo = newSearch.actualDateTo;
actualDateFrom = newSearch.actualDateFrom;
model = newSearch.model;
@ -36,46 +39,47 @@ class VisitsSearch{
statusValue = newSearch.statusValue;
}
String toSearchString(){
String _search = "";
Map<String,dynamic> toMap(){
Map<String,dynamic> _search = {};
if(deviceSerialNumber != null && deviceSerialNumber.isNotEmpty){
_search += "&sn_id=$deviceSerialNumber";
_search["assetId"]= deviceSerialNumber;
}
if(hospitalName != null && hospitalName.isNotEmpty){
_search += "&client=$hospitalName";
if(hospital != null){
_search["siteId"]= hospital.id;
}
if(brand != null && brand.isNotEmpty){
_search += "&brand=$brand";
// todo get new key
_search[""]= brand;
}
if(model != null && model.isNotEmpty){
_search += "&model=$model";
if(model != null){
_search["modelId"]= model.id;
}
if(expectedDateFrom != null){
_search += "&expected_date_from=${expectedDateFrom.millisecondsSinceEpoch ~/ 1000}";
_search["expectedDateFrom"]= expectedDateFrom.toIso8601String();
}
if(expectedDateTo != null){
_search += "&expected_date_to=${expectedDateTo.millisecondsSinceEpoch~/1000}";
_search["expectedDateTo"]= expectedDateTo.toIso8601String();
}
if(actualDateFrom != null){
_search += "&actual_date_from=${actualDateFrom.millisecondsSinceEpoch ~/ 1000}";
_search["actualDateFrom"]= actualDateFrom.toIso8601String();
}
if(actualDateTo != null){
_search += "&actual_date_to=${actualDateTo.millisecondsSinceEpoch~/1000}";
_search["actualDateTo"]= actualDateTo.toIso8601String();
}
if(statusValue != null){
_search += "&status=$statusValue";
_search["visitStatusId"]= statusValue.id;
}
if(contactStatus != null){
_search += "&assigned_to=$contactStatus";
_search["assignedToId"]= contactStatus.id;
}
return _search;
}

@ -108,7 +108,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
style: Theme.of(context).textTheme.headline6
),
),
if(_isSender)
if(_isSender || true)
ASmallButton(
text: _subtitle.edit,
onPressed: (){
@ -134,7 +134,7 @@ class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
style: Theme.of(context).textTheme.headline6
),
),
if(_isReceiver)
if(_isReceiver || true)
ASmallButton(
text: _subtitle.edit,
onPressed: (){

@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart';
import 'package:test_sa/controllers/api_routes/http_status_manger.dart';
import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
@ -33,7 +33,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
SettingProvider _settingProvider;
DeviceTransferProvider _deviceTransferProvider;
final TextEditingController _requestedQuantityController = TextEditingController();
final DeviceTransfer _formModel = DeviceTransfer(receiver: DeviceTransferInfo());
final DeviceTransfer _formModel = DeviceTransfer(receiver: DeviceTransferInfo(),sender: DeviceTransferInfo());
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@ -57,7 +57,7 @@ class _RequestDeviceTransferState extends State<RequestDeviceTransfer> {
_isLoading = true;
setState(() {});
_formModel.sender.client.id = _userProvider.user.hospital?.id;
int status = await _deviceTransferProvider.createRequest(
user: _userProvider.user,
host: _settingProvider.host,

@ -4,7 +4,7 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart';
import 'package:test_sa/controllers/api_routes/http_status_manger.dart';
import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
@ -69,22 +69,12 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
_validate = false;
Navigator.of(context).pop();
Navigator.of(context).pop();
}else{
String errorMessage = HttpStatusManger.getStatusMessage(
status: status, subtitle: _subtitle);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
errorMessage
),
)
);
}
}
@override
void setState(VoidCallback fn){
if(mounted) super.setState(() {});
if(!mounted) super.setState(() {});
}
@override
@ -207,7 +197,9 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
newSignature: _signature,
onSaved: (signature){
_signature = signature;
if(signature == null || signature.isEmpty) return;
_formModel.signature = base64Encode(signature);
},
),
Padding(

@ -1,5 +1,5 @@
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/controllers/http_status_manger/http_status_manger.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/notification/notification_manger.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
@ -119,13 +119,16 @@ class _LoginState extends State<Login> {
user: _user,
host: _settingProvider.host,
);
if(status >= 200 && status < 300){
if(status >= 200 && status < 300 ){
_settingProvider.setUser(_userProvider.user);
if(_userProvider.user.isActive)
Navigator.of(context).pushNamed(LandPage.id);
else
Fluttertoast.showToast(msg: _subtitle.activationAlert);
// if(_userProvider.user.isActive)
// Navigator.of(context).pushNamed(LandPage.id);
// else
// Fluttertoast.showToast(msg: _subtitle.activationAlert);
}else{
if(status >= 400 && status < 500) return;
String errorMessage = status == 400
? _subtitle.wrongEmailOrPassword
: HttpStatusManger.getStatusMessage(

@ -2,7 +2,7 @@ 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/http_status_manger/http_status_manger.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';

@ -27,10 +27,13 @@ class _SplashScreenState extends State<SplashScreen> {
UserProvider _userProvider;
_goToUserScreen(User user){
print(user.toJson());
if(user.tokenLife != null && user.tokenLife.isAfter(DateTime.now())){
_userProvider.user = user;
// Navigator.of(context).pushNamed(Login.id);
Navigator.of(context).pushNamed(LandPage.id);
}
}
@override
void initState() {

@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/http_status_manger/http_status_manger.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/gas_refill_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
@ -177,7 +177,8 @@ class _GasRefillDetailsState extends State<GasRefillDetails> {
textScaleFactor: AppStyle.getScaleFactor(context),
),
),
StatusLabel(label: _model.status.label,
if(_model.status?.id != null)
StatusLabel(label: _model.status.name,
color: AColors.getGasStatusColor(_model.status.id)
),
],

@ -1,19 +1,23 @@
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart';
import 'package:test_sa/controllers/api_routes/http_status_manger.dart';
import 'package:test_sa/controllers/providers/api/gas_refill_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/controllers/validator/validator.dart';
import 'package:test_sa/models/gas_refill/gas_refill_details.dart';
import 'package:test_sa/models/gas_refill/gas_refill_model.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/app_text_form_field.dart';
import 'package:test_sa/views/widgets/buttons/app_button.dart';
import 'package:test_sa/views/widgets/gas_refill/gas_refill_create_details_item.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/status/gas_refill/gas_cylinder_size.dart';
import 'package:test_sa/views/widgets/status/gas_refill/gas_cylinder_type.dart';
import 'package:test_sa/views/widgets/status/gas_refill/gas_status.dart';
import 'package:test_sa/views/widgets/status/gas_refill/gas_type.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
@ -153,19 +157,21 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
// _formModel.title = value;
// },
// ),
// // const SizedBox(height: 8,),
// ASubTitle(_subtitle.status),
// if(_validate && _formModel.status == null)
// ASubTitle(_subtitle.requiredWord,color: Colors.red,),
// const SizedBox(height: 4,),
// GasStatusMenu(
// initialValue: _formModel.status,
// onSelect: (status){
// _formModel.status = status;
// },
// ),
// const SizedBox(height: 8,),
// Divider(color: Theme.of(context).colorScheme.primary,),
ASubTitle(_subtitle.status),
if(_validate && _formModel.status == null)
ASubTitle(_subtitle.requiredWord,color: Colors.red,),
const SizedBox(height: 4,),
GasStatusMenu(
initialValue: _formModel.status ?? const Lookup(
value: 1
),
onSelect: (status){
_formModel.status = status;
},
),
const SizedBox(height: 8,),
Divider(color: Theme.of(context).colorScheme.primary,),
const SizedBox(height: 4,),
const ASubTitle("Type"),
if(_validate && _currentDetails.type == null)
@ -178,17 +184,28 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
},
),
// const SizedBox(height: 8,),
// const ASubTitle("Cylinder Size"),
// if(_validate && _currentDetails.cylinderSize == null)
// ASubTitle(_subtitle.requiredWord,color: Colors.red,),
// const SizedBox(height: 4,),
// GasCylinderSizeMenu(
// initialValue: _currentDetails.cylinderSize,
// onSelect: (status){
// _currentDetails.cylinderSize = status;
// },
// ),
const SizedBox(height: 8,),
const ASubTitle("Cylinder Size"),
if(_validate && _currentDetails.cylinderSize == null)
ASubTitle(_subtitle.requiredWord,color: Colors.red,),
const SizedBox(height: 4,),
GasCylinderSizeMenu(
initialValue: _currentDetails.cylinderSize,
onSelect: (status){
_currentDetails.cylinderSize = status;
},
),
const SizedBox(height: 8,),
const ASubTitle("Cylinder Type"),
if(_validate && _currentDetails.cylinderSize == null)
ASubTitle(_subtitle.requiredWord,color: Colors.red,),
const SizedBox(height: 4,),
GasCylinderTypesMenu(
initialValue: _currentDetails.cylinderType,
onSelect: (status){
_currentDetails.cylinderType = status;
},
),
const SizedBox(height: 8,),
ASubTitle(_subtitle.quantity),
if(_validate && _currentDetails.requestedQuantity == null)
@ -204,7 +221,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
? null : "allow numbers only",
textInputType: TextInputType.number,
onSaved: (value){
_currentDetails.requestedQuantity = int.tryParse(value);
_currentDetails.requestedQuantity = double.tryParse(value);
},
),
const SizedBox(height: 8,),

@ -366,13 +366,18 @@ class _LandPageState extends State<LandPage> {
child: Icon(Icons.person,size: 72,color: Theme.of(context).colorScheme.primary,),
),
),
Text(
_userProvider.user.userName,
Padding(
padding: const EdgeInsets.all(8.0),
child: FittedBox(
child: Text(
_userProvider.user?.userName ?? "??",
style: Theme.of(context).textTheme.headline6.copyWith(
fontWeight: FontWeight.normal,
),
textScaleFactor: AppStyle.getScaleFactor(context),
),
),
),
],
),
),

@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/http_status_manger/http_status_manger.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';

@ -5,13 +5,15 @@ 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/http_status_manger/http_status_manger.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/service_requests_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/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/device/device.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/colors.dart';
@ -26,6 +28,8 @@ import 'package:test_sa/views/widgets/sound/record_sound.dart';
import 'package:test_sa/views/widgets/speech_to_text/speech_to_text.dart';
import 'package:test_sa/views/widgets/status/service_request/service_request_defect_types_mune.dart';
import 'package:test_sa/views/widgets/status/service_request/service_request_priority_mune.dart';
import 'package:test_sa/views/widgets/status/service_request/service_request_through_mune.dart';
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';
class CreateRequestPage extends StatefulWidget {
static final String id = "/create-request";
@ -163,6 +167,24 @@ class _CreateRequestPageState extends State<CreateRequestPage> {
_serviceRequest.defectType = status;
},
),
const SizedBox(height: 8,),
const ASubTitle("Type"),
const SizedBox(height: 4,),
ServiceRequestTypesMenu(
initialValue: _serviceRequest.type,
onSelect: (status){
_serviceRequest.type = status;
},
),
const SizedBox(height: 8,),
const ASubTitle("Through"),
const SizedBox(height: 4,),
ServiceRequestedThroughMenu(
initialValue: const Lookup(name: "App",value: 3),
onSelect: (status){
_serviceRequest.requestedThrough = status;
},
),
MultiImagesPicker(
label: _subtitle.deviceImages,
images: _deviceImages,
@ -204,14 +226,14 @@ class _CreateRequestPageState extends State<CreateRequestPage> {
if(!_formKey.currentState.validate())
return;
_formKey.currentState.save();
_serviceRequest.deviceId = _device?.id ?? "";
_serviceRequest.deviceId = _device?.id;
_isLoading =true;
setState(() {});
_serviceRequest.devicePhotos = _deviceImages.map(
(e) => base64Encode(e.readAsBytesSync())).toList();
(e) => "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}").toList();
if(_serviceRequest.audio != null){
final file = File(_serviceRequest.audio);
_serviceRequest.audio = base64Encode(file.readAsBytesSync());
_serviceRequest.audio = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}";
}
int status = await _serviceRequestsProvider.createRequest(
user: _userProvider.user,

@ -5,7 +5,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/http_status_manger/http_status_manger.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/service_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart';

@ -5,7 +5,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/http_status_manger/http_status_manger.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/service_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart';
@ -273,8 +273,8 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
ServiceReportLastCallsMenu(
report: _serviceReport,
onSelect: (status){
if(status?.id == 12
|| _serviceReport.callLastSituation?.id == 12){
if(status?.value == 12
|| _serviceReport.callLastSituation?.value == 12){
_serviceReport.callLastSituation = status;
setState(() {});
} else {
@ -289,7 +289,7 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
),
const SizedBox(height: 8,),
// invoice number & code
_serviceReport.callLastSituation?.id != 12 ? const SizedBox.shrink():
_serviceReport.callLastSituation?.value != 12 ? const SizedBox.shrink():
Row(
children: [
Expanded(

@ -2,7 +2,7 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/http_status_manger/http_status_manger.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/service_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
@ -61,9 +61,21 @@ class RequestDetailsPage extends StatelessWidget {
),
),
),
Visibility(
visible: _userProvider.user.type == UsersTypes.normal_user,
replacement: AIconButton(
_userProvider.user.type == UsersTypes.normal_user ?
AIconButton(
iconData: Icons.warning_amber_rounded,
color: AColors.white,
buttonSize: 42,
backgroundColor: AColors.deepOrange,
onPressed: (){
Navigator.of(context).push(
MaterialPageRoute(
builder: (_) => ReportIssuesPage(serviceRequest: serviceRequest,)
)
);
},
)
: AIconButton(
iconData: Icons.edit,
color: AColors.white,
buttonSize: 42,
@ -103,20 +115,6 @@ class RequestDetailsPage extends StatelessWidget {
// );
},
),
child: AIconButton(
iconData: Icons.warning_amber_rounded,
color: AColors.white,
buttonSize: 42,
backgroundColor: AColors.deepOrange,
onPressed: (){
Navigator.of(context).push(
MaterialPageRoute(
builder: (_) => ReportIssuesPage(serviceRequest: serviceRequest,)
)
);
},
),
),
SizedBox(width: 16,)
],
),

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

@ -1,12 +1,15 @@
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/http_status_manger/http_status_manger.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/regular_visits_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/pantry/calibration_tools.dart';
import 'package:test_sa/models/pantry/pentry.dart';
import 'package:test_sa/models/pantry/pm_kit.dart';
import 'package:test_sa/models/pantry/ppm_check_list.dart';
import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/visits/visit.dart';
import 'package:test_sa/views/widgets/buttons/app_small_button.dart';
@ -61,17 +64,20 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
);
// Navigator.of(context).pop();
}else{
String errorMessage = HttpStatusManger.getStatusMessage(
status: status, subtitle: _subtitle);
Fluttertoast.showToast(
msg: errorMessage,
);
// String errorMessage = HttpStatusManger.getStatusMessage(
// status: status, subtitle: _subtitle);
// Fluttertoast.showToast(
// msg: errorMessage,
// );
}
}
@override
void initState() {
_pentry = widget.pentry;
_pentry = widget.pentry.copyWith();
if(_pentry.pmKits.isEmpty) _pentry.pmKits.add(PMKit());
if(_pentry.calibrationTools.isEmpty) _pentry.calibrationTools.add(CalibrationTool());
if(_pentry.ppmCheckLists.isEmpty) _pentry.ppmCheckLists.add(PPMCheckList());
_tabController = TabController(length: 4, vsync: this);
super.initState();
}

@ -2,7 +2,7 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/http_status_manger/http_status_manger.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/preventive_maintenance_visits_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
@ -109,7 +109,7 @@ class _PreventiveMaintenanceVisitsPageState extends State<PreventiveMaintenanceV
),
),
Visibility(
visible: _visitsProvider.visitsSearch.toSearchString().isNotEmpty,
visible: _visitsProvider.visitsSearch.toMap().isNotEmpty,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: AButton(

@ -2,7 +2,7 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/http_status_manger/http_status_manger.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/regular_visits_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
@ -107,7 +107,7 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
),
),
Visibility(
visible: _visitsProvider.visitsSearch.toSearchString().isNotEmpty,
visible: _visitsProvider.visitsSearch.toMap().isNotEmpty,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: AButton(
@ -156,7 +156,7 @@ class _RegularVisitsPageState extends State<RegularVisitsPage>
Navigator.of(context).pop();
if(status >= 200 && status < 300){
Fluttertoast.showToast(
msg: _subtitle.regularVisitsUpdatedSuccessfully,
msg: _subtitle.preventiveMaintenanceUpdatedSuccessfully,
toastLength: Toast.LENGTH_LONG,
gravity: ToastGravity.BOTTOM,
);

@ -15,6 +15,7 @@ import 'package:test_sa/views/widgets/buttons/app_small_button.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/images/one_image_picker.dart';
import 'package:test_sa/views/widgets/search/filter_item.dart';
import 'package:test_sa/views/widgets/status/employee/engineers_mune.dart';
import 'package:test_sa/views/widgets/visits/visit_status.dart';
class UpdateVisitsGroupSheet extends StatefulWidget {
final List<Visit> visits;
@ -26,25 +27,25 @@ class UpdateVisitsGroupSheet extends StatefulWidget {
}
class _UpdateVisitsGroupSheetState extends State<UpdateVisitsGroupSheet> {
List<Lookup> status = [
Lookup(label: "Done", id: 0,),
Lookup(label: "Not Yet", id: 1),
Lookup(label: "On Hold", id: 2,),
];
List<Lookup> taskStatus = [
Lookup(label: "Passed", id: 0,),
Lookup(label: "Failed", id: 1),
];
// List<Lookup> status = [
// Lookup(name: "Done", id: 0,),
// Lookup(name: "Not Yet", id: 1),
// Lookup(name: "On Hold", id: 2,),
// ];
//
// List<Lookup> taskStatus = [
// Lookup(name: "Passed", id: 0,),
// Lookup(name: "Failed", id: 1),
// ];
VisitsGroup _group = VisitsGroup();
File _image;
// File _image;
Subtitle _subtitle;
@override
void initState() {
super.initState();
_group.visits = widget.visits;
_group.date = DateTime.now();
//_group.date = DateTime.now();
}
@override
@ -78,123 +79,130 @@ class _UpdateVisitsGroupSheetState extends State<UpdateVisitsGroupSheet> {
),
],
),
AOneImagePicker(
image: _image,
onPick: (image){
_image =image;
_group.image = base64Encode(image.readAsBytesSync());
},
),
SizedBox(height: 12 * AppStyle.getScaleFactor(context),),
ATextFormField(
initialValue: _group.jobSheetNumber,
hintText: _subtitle.jobSheetNumber,
style: Theme.of(context).textTheme.headline6,
onSaved: (value){
_group.jobSheetNumber = value;
},
),
SizedBox(height: 8 * AppStyle.getScaleFactor(context),),
ATextFormField(
initialValue: _group.workingHours,
hintText: _subtitle.workingHours,
style: Theme.of(context).textTheme.headline6,
onSaved: (value){
_group.workingHours = value;
},
),
SizedBox(height: 8 * AppStyle.getScaleFactor(context),),
ATextFormField(
initialValue: _group.travelingHours,
hintText: _subtitle.travelingHours,
style: Theme.of(context).textTheme.headline6,
onSaved: (value){
_group.travelingHours = value;
},
),
SizedBox(height: 8 * AppStyle.getScaleFactor(context),),
Row(
children: [
Expanded(
child: Text(
"${_subtitle.date} :",
style: Theme.of(context).textTheme.subtitle1,
textScaleFactor: AppStyle.getScaleFactor(context),
),
),
ADatePicker(
date: _group.date ?? DateTime.now(),
onDatePicker: (date){
_group.date = date;
setState(() {});
},
),
],
),
// SizedBox(height: 8 * AStyling.getScaleFactor(context),),
Text(
"${_subtitle.status} :",
style: Theme.of(context).textTheme.subtitle1,
textScaleFactor: AppStyle.getScaleFactor(context),
),
SizedBox(height: 8 * AppStyle.getScaleFactor(context),),
Center(
child: Wrap(
spacing: 10,
runSpacing: 10,
children: List.generate(
status.length,
(index) {
bool isSelected = _group.status == status[index];
return FilterItem(
isSelected: isSelected,
onSelected: (){
if(isSelected)
_group.status = null;
else
_group.status = status[index];
setState(() {});
EngineersMenu(
initialValue: _group.engineer,
onSelect: (engineer){
_group.engineer = engineer;
},
status: status[index],
);
}
),
),
),
Text(
"${_subtitle.taskStatus} :",
style: Theme.of(context).textTheme.subtitle1,
textScaleFactor: AppStyle.getScaleFactor(context),
),
SizedBox(height: 8 * AppStyle.getScaleFactor(context),),
Center(
child: Wrap(
spacing: 10,
runSpacing: 10,
children: List.generate(
taskStatus.length,
(index) {
bool isSelected = _group.taskStatus == taskStatus[index];
return FilterItem(
isSelected: isSelected,
onSelected: (){
if(isSelected)
_group.taskStatus = null;
else
_group.taskStatus = taskStatus[index];
setState(() {});
},
status: taskStatus[index],
);
}
),
),
),
// AOneImagePicker(
// image: _image,
// onPick: (image){
// _image =image;
// _group.image = base64Encode(image.readAsBytesSync());
// },
// ),
// SizedBox(height: 12 * AppStyle.getScaleFactor(context),),
// ATextFormField(
// initialValue: _group.jobSheetNumber,
// hintText: _subtitle.jobSheetNumber,
// style: Theme.of(context).textTheme.headline6,
// onSaved: (value){
// _group.jobSheetNumber = value;
// },
// ),
// SizedBox(height: 8 * AppStyle.getScaleFactor(context),),
// ATextFormField(
// initialValue: _group.workingHours,
// hintText: _subtitle.workingHours,
// style: Theme.of(context).textTheme.headline6,
// onSaved: (value){
// _group.workingHours = value;
// },
// ),
// SizedBox(height: 8 * AppStyle.getScaleFactor(context),),
// ATextFormField(
// initialValue: _group.travelingHours,
// hintText: _subtitle.travelingHours,
// style: Theme.of(context).textTheme.headline6,
// onSaved: (value){
// _group.travelingHours = value;
// },
// ),
// SizedBox(height: 8 * AppStyle.getScaleFactor(context),),
// Row(
// children: [
// Expanded(
// child: Text(
// "${_subtitle.date} :",
// style: Theme.of(context).textTheme.subtitle1,
// textScaleFactor: AppStyle.getScaleFactor(context),
// ),
// ),
// ADatePicker(
// date: _group.date ?? DateTime.now(),
// onDatePicker: (date){
// _group.date = date;
// setState(() {});
// },
// ),
// ],
// ),
// // SizedBox(height: 8 * AStyling.getScaleFactor(context),),
// Text(
// "${_subtitle.status} :",
// style: Theme.of(context).textTheme.subtitle1,
// textScaleFactor: AppStyle.getScaleFactor(context),
// ),
// SizedBox(height: 8 * AppStyle.getScaleFactor(context),),
// Center(
// child: Wrap(
// spacing: 10,
// runSpacing: 10,
// children: List.generate(
// status.length,
// (index) {
// bool isSelected = _group.status == status[index];
// return FilterItem(
// isSelected: isSelected,
// onSelected: (){
// if(isSelected)
// _group.status = null;
// else
// _group.status = status[index];
//
// setState(() {});
// },
// status: status[index],
// );
// }
//
// ),
// ),
// ),
// Text(
// "${_subtitle.taskStatus} :",
// style: Theme.of(context).textTheme.subtitle1,
// textScaleFactor: AppStyle.getScaleFactor(context),
// ),
// SizedBox(height: 8 * AppStyle.getScaleFactor(context),),
// Center(
// child: Wrap(
// spacing: 10,
// runSpacing: 10,
// children: List.generate(
// taskStatus.length,
// (index) {
// bool isSelected = _group.taskStatus == taskStatus[index];
// return FilterItem(
// isSelected: isSelected,
// onSelected: (){
// if(isSelected)
// _group.taskStatus = null;
// else
// _group.taskStatus = taskStatus[index];
//
// setState(() {});
// },
// status: taskStatus[index],
// );
// }
//
// ),
// ),
// ),
SizedBox(height: 8 * AppStyle.getScaleFactor(context),),
Expanded(
child: ListView.builder(
@ -240,10 +248,7 @@ class _UpdateVisitsGroupSheetState extends State<UpdateVisitsGroupSheet> {
),
],
),
Align(
alignment: Alignment.topRight,
),
],
),
);

@ -5,6 +5,7 @@ import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/visits/visit.dart';
import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/pages/user/visits/pantry/edit_pentry.dart';
import 'package:test_sa/views/pages/user/visits/pantry/future_edit_pently.dart';
import 'package:test_sa/views/widgets/buttons/app_back_button.dart';
import 'package:test_sa/views/widgets/buttons/app_icon_button.dart';
@ -52,7 +53,7 @@ class VisitDetailsPage extends StatelessWidget {
backgroundColor: AColors.green,
onPressed: () async {
Navigator.of(context).push(
MaterialPageRoute(builder: (_)=> FutureEditPentry(visit: visit,))
MaterialPageRoute(builder: (_)=> EditPentry(visit: visit,pentry: visit.pentry,))
);
},
),

@ -26,7 +26,7 @@ class DeviceTransferInfoSection extends StatelessWidget {
),
RequestInfoRow(
title: subtitle.engineerName,
info: info.name,
info: info.userName,
),
RequestInfoRow(
title: subtitle.workingHours,
@ -52,7 +52,7 @@ class DeviceTransferInfoSection extends StatelessWidget {
RequestInfoRow(
title: subtitle.status,
infoWidget: StatusLabel(
label: info.status?.label,
label: info.status?.name,
color: AColors.getGasStatusColor(info.status?.id)
),
),

@ -79,7 +79,7 @@ class DeviceTransferItem extends StatelessWidget {
),
StatusLabel(
color: AColors.getRequestStatusColor(item.sender.status?.id),
label: item.sender.status?.label,
label: item.sender.status?.name,
)
],
@ -99,6 +99,7 @@ class DeviceTransferItem extends StatelessWidget {
],
),
if(item.sender.department.id != null)
Text(
item.sender.department.name,
style: Theme.of(context).textTheme.bodySmall.copyWith(
@ -118,7 +119,7 @@ class DeviceTransferItem extends StatelessWidget {
),
StatusLabel(
color: AColors.getRequestStatusColor(item.receiver.status?.id),
label: item.receiver.status?.label,
label: item.receiver.status?.name,
)
],
@ -138,6 +139,7 @@ class DeviceTransferItem extends StatelessWidget {
],
),
if(item.receiver.department.id != null)
Text(
item.receiver.department.name,
style: Theme.of(context).textTheme.bodySmall.copyWith(

@ -10,8 +10,8 @@ import 'package:flutter_typeahead/flutter_typeahead.dart';
import 'package:provider/provider.dart';
class AutoCompleteDeviceField extends StatefulWidget {
final Device initialValue;
final String hospitalId;
final Function(String) onPick;
final int hospitalId;
final Function(int) onPick;
const AutoCompleteDeviceField({Key key, this.initialValue, this.onPick, this.hospitalId}) : super(key: key);
@ -74,7 +74,7 @@ class _AutoCompleteDeviceFieldState extends State<AutoCompleteDeviceField> {
return await _devicesProvider.getDevicesList(
host: _settingProvider.host,
user: _userProvider.user,
hospitalId: widget.hospitalId,
hospitalId: widget.hospitalId ?? _userProvider.user.hospital.id,
serialNumber: value,
);
},

@ -0,0 +1,92 @@
import 'package:test_sa/controllers/providers/api/devices_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/device/device.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:flutter/material.dart';
import 'package:flutter_typeahead/flutter_typeahead.dart';
import 'package:provider/provider.dart';
class AutoCompleteModelField extends StatefulWidget {
final Lookup initialValue;
final Function(Lookup) onPick;
const AutoCompleteModelField({Key key, this.initialValue, this.onPick,}) : super(key: key);
@override
_AutoCompleteModelFieldState createState() => _AutoCompleteModelFieldState();
}
class _AutoCompleteModelFieldState extends State<AutoCompleteModelField> {
SettingProvider _settingProvider;
DevicesProvider _devicesProvider;
UserProvider _userProvider;
TextEditingController _controller;
@override
void initState() {
_controller = TextEditingController(text: widget.initialValue?.name);
super.initState();
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
_settingProvider = Provider.of<SettingProvider>(context);
_userProvider = Provider.of<UserProvider>(context);
_devicesProvider = Provider.of<DevicesProvider>(context);
//Subtitle _subtitle = AppLocalization.of(context).subtitle;
return Container(
padding: const EdgeInsets.symmetric(
horizontal: 16
),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color:AColors.black),
borderRadius: BorderRadius.circular(
AppStyle.borderRadius * AppStyle.getScaleFactor(context)
),
boxShadow: [
AppStyle.boxShadow
]
),
child: TypeAheadField<Lookup>(
textFieldConfiguration: TextFieldConfiguration(
style: Theme.of(context).textTheme.headline6,
controller: _controller,
textAlign: TextAlign.center,
decoration: const InputDecoration(
hintText: "Model",
border: InputBorder.none,
disabledBorder: InputBorder.none,
focusedBorder: InputBorder.none,
enabledBorder: InputBorder.none,
),
textInputAction: TextInputAction.search,
),
suggestionsCallback: (value) async {
return await _devicesProvider.getModels(
code: value,
);
},
itemBuilder: (context, lookup) {
return ListTile(
title: Text(lookup.name),
);
},
onSuggestionSelected: (lookup) {
_controller.text = lookup.name;
widget.onPick(lookup);
},
),
);
}
}

@ -28,6 +28,8 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
bool _firstTime = true;
Subtitle _subtitle;
TextEditingController numberController = TextEditingController();
TextEditingController snController = TextEditingController();
_getDevice(String result) async {
if(result == null) return;
showDialog(
@ -58,6 +60,8 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
@override
void dispose() {
numberController.dispose();
snController.dispose();
super.dispose();
}
@ -68,6 +72,7 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
_settingProvider = Provider.of<SettingProvider>(context);
if(_firstTime && _devicesProvider.devices != null){
_searchableList.clear();
_searchableList.addAll(_devicesProvider.devices);
_firstTime = false;
}
@ -83,7 +88,7 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
await _devicesProvider.getEquipment(
user: _userProvider.user,
host: _settingProvider.host,
hospitalId: _userProvider.user.hospital.id
hospitalId: _userProvider.user.hospital?.id
);
},
child: Column(
@ -95,31 +100,41 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
children: [
ATextFormField(
hintText: _subtitle.searchBySn,
controller: snController,
style: Theme.of(context).textTheme.subtitle1,
suffixIcon: const Icon(Icons.search_rounded),
onChange: (value){
textInputAction: TextInputAction.search,
onAction: () async {
_devicesProvider.reset();
await _devicesProvider.getEquipment(
user: _userProvider.user,
host: _settingProvider.host,
hospitalId: _userProvider.user.hospital?.id,
serialNumber: snController.text,
number: numberController.text
);
_searchableList.clear();
_searchableList.addAll(_devicesProvider.devices.where(
(element) => element.serialNumber.toLowerCase().contains(
value.toLowerCase()
)
).toList());
setState(() {});
_searchableList.addAll(_devicesProvider.devices);
},
),
const SizedBox(height: 8,),
ATextFormField(
hintText: "Search by Number",
controller: numberController,
style: Theme.of(context).textTheme.subtitle1,
suffixIcon: const Icon(Icons.search_rounded),
onChange: (value){
textInputAction: TextInputAction.search,
onAction: () async {
_devicesProvider.reset();
await _devicesProvider.getEquipment(
user: _userProvider.user,
host: _settingProvider.host,
hospitalId: _userProvider.user.hospital?.id,
serialNumber: snController.text,
number: numberController.text
);
_searchableList.clear();
_searchableList.addAll(_devicesProvider.devices.where(
(element) => element.number.toLowerCase().contains(
value.toLowerCase()
)
).toList());
setState(() {});
_searchableList.addAll(_devicesProvider.devices);
},
),
],
@ -145,16 +160,16 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
],
),
),
floatingActionButton: FloatingActionButton(
heroTag: "some tag 2",
child: const Icon(Icons.qr_code_scanner),
onPressed: () async {
String result = await Navigator.of(context).push(
MaterialPageRoute(builder: (_)=> const ScanQr()),
) as String;
_getDevice(result);
},
),
// floatingActionButton: FloatingActionButton(
// heroTag: "some tag 2",
// child: const Icon(Icons.qr_code_scanner),
// onPressed: () async {
// String result = await Navigator.of(context).push(
// MaterialPageRoute(builder: (_)=> const ScanQr()),
// ) as String;
// _getDevice(result);
// },
// ),
);
}
}

@ -15,7 +15,7 @@ class GasRefillCreateDetailsItem extends StatelessWidget {
children: [
Row(
children: [
Expanded(child: Text(model.type.label)),
Expanded(child: Text(model.type.name)),
IconButton(
onPressed: onDelete,
color: AColors.red,
@ -23,9 +23,12 @@ class GasRefillCreateDetailsItem extends StatelessWidget {
)
],
),
Row(
Wrap(
spacing: 10,
children: [
Text(model.requestedQuantity.toStringAsFixed(0)),
Text("Quantity: ${model.requestedQuantity.toStringAsFixed(0)}"),
Text("Cylinder Size: ${model.cylinderSize.name}"),
Text("Cylinder Type: ${model.cylinderType.name}"),
],
),
if(model.deliveredQuantity != null)

@ -75,6 +75,7 @@ class GasRefillItem extends StatelessWidget {
),
),
),
if(item.clientName != null)
Text(
item.clientName,
style: Theme.of(context).textTheme.subtitle2.copyWith(
@ -95,7 +96,8 @@ class GasRefillItem extends StatelessWidget {
),
),
),
StatusLabel(label: item.status.label,
if(item.status?.id != null)
StatusLabel(label: item.status.name,
color: AColors.getGasStatusColor(item.status.id)
),
],

@ -22,10 +22,10 @@ class GasRefillUpdateDetailsItem extends StatelessWidget {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ATitle(details.type.label),
ATitle(details.type.name),
RequestInfoRow(
title: "Cylinder Size",
info: details.cylinderSize.label,
info: details.cylinderSize.name,
),
RequestInfoRow(
title: "Requested Quantity",
@ -48,14 +48,14 @@ class GasRefillUpdateDetailsItem extends StatelessWidget {
? null : "allow numbers only",
textInputType: TextInputType.number,
onSaved: (value){
details.deliveredQuantity = int.tryParse(value);
details.deliveredQuantity = double.tryParse(value);
},
),
],
):
RequestInfoRow(
title: "Delivered Quantity",
info: details.deliveredQuantity.toStringAsFixed(0),
info: details.deliveredQuantity?.toStringAsFixed(0),
),
//SizedBox(height: 16,)
],

@ -11,10 +11,10 @@ import 'package:flutter_typeahead/flutter_typeahead.dart';
import 'package:provider/provider.dart';
class HospitalAutoCompleteField extends StatefulWidget {
final String initialValue;
final Function(String) onSearch;
final Function(String) onSave;
final Function(Hospital) onSearch;
//final Function(Hospital) onSave;
const HospitalAutoCompleteField({Key key, this.onSearch, this.initialValue, this.onSave}) : super(key: key);
const HospitalAutoCompleteField({Key key, this.onSearch, this.initialValue, }) : super(key: key);
@override
_HospitalAutoCompleteFieldState createState() => _HospitalAutoCompleteFieldState();
@ -58,7 +58,6 @@ class _HospitalAutoCompleteFieldState extends State<HospitalAutoCompleteField> {
child: TypeAheadField<Hospital>(
textFieldConfiguration: TextFieldConfiguration(
style: Theme.of(context).textTheme.headline6,
onSubmitted: widget.onSave,
controller: _controller,
textAlign: TextAlign.center,
decoration: InputDecoration(
@ -69,9 +68,6 @@ class _HospitalAutoCompleteFieldState extends State<HospitalAutoCompleteField> {
enabledBorder: InputBorder.none,
),
textInputAction: TextInputAction.search,
onEditingComplete:(){
widget.onSearch(_controller.text);
}
),
suggestionsCallback: (vale) async {
return await HospitalsProvider().getHospitalsList(
@ -80,12 +76,12 @@ class _HospitalAutoCompleteFieldState extends State<HospitalAutoCompleteField> {
);
},
itemBuilder: (context, hospital) {
return HospitalItem(
hospital: hospital,
return ListTile(
title: Text(hospital.name),
);
},
onSuggestionSelected: (hospital) {
widget.onSearch(hospital.name);
widget.onSearch(hospital);
},
),
);

@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart';
import 'package:test_sa/controllers/api_routes/http_status_manger.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/models/subtitle.dart';

@ -10,7 +10,7 @@ import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart';
class AutoCompleteDeviceNumberField extends StatefulWidget {
final Lookup initialValue;
final String hospitalId;
final int hospitalId;
final Function(Lookup) onPick;
const AutoCompleteDeviceNumberField({Key key, this.initialValue, this.onPick, this.hospitalId}) : super(key: key);
@ -28,7 +28,7 @@ class _AutoCompleteDeviceNumberFieldState extends State<AutoCompleteDeviceNumber
@override
void initState() {
_controller = TextEditingController(text: widget.initialValue?.label);
_controller = TextEditingController(text: widget.initialValue?.name);
super.initState();
}
@ -86,7 +86,7 @@ class _AutoCompleteDeviceNumberFieldState extends State<AutoCompleteDeviceNumber
},
onSuggestionSelected: (device) {
_controller.text = device.number;
widget.onPick(Lookup(id: int.tryParse(device.id),label: device.number));
widget.onPick(Lookup(id: device.id,name: device.number));
},
),
);

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

@ -1,4 +1,7 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
@ -6,6 +9,7 @@ import 'package:test_sa/models/pantry/pentry.dart';
import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/app_text_form_field.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/e_signature/e_signature.dart';
import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart';
import 'package:test_sa/views/widgets/status/pentry/pentry_status_mune.dart';
import 'package:test_sa/views/widgets/status/pentry/pentry_visit_status_mune.dart';
@ -23,7 +27,6 @@ class PentryInfoForm extends StatefulWidget {
}
class _PentryInfoFormState extends State<PentryInfoForm> {
@override
Widget build(BuildContext context) {
final subtitle = AppLocalization.of(context).subtitle;
@ -87,6 +90,20 @@ class _PentryInfoFormState extends State<PentryInfoForm> {
},
),
const SizedBox(height: 8,),
const ASubTitle("Expected Visit Date"),
if(widget.enableValidate && widget.model.expectedVisitDate == null)
ASubTitle(subtitle.requiredWord,color: Colors.red,),
const SizedBox(height: 4,),
ADatePicker(
date: widget.model.expectedVisitDate,
from: DateTime.now().subtract(const Duration(days: 30)),
onDatePicker: (date){
if(date == null) return;
widget.model.expectedVisitDate = date;
setState(() {});
},
),
const SizedBox(height: 8,),
const ASubTitle("Traveling Hours"),
const SizedBox(height: 4,),
ATextFormField(
@ -108,6 +125,20 @@ class _PentryInfoFormState extends State<PentryInfoForm> {
},
),
const SizedBox(height: 8,),
const ASubTitle("Signature"),
ESignature(
oldSignature: widget.model.signature,
newSignature: widget.model.localSignature,
onSaved: (signature){
widget.model.localSignature = signature;
if(signature == null || signature.isEmpty) {
widget.model.signature = null;
return;
}
widget.model.signature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
},
),
const SizedBox(height: 8,),
],
);
}

@ -67,84 +67,84 @@ class _PentryPMKitFormState extends State<PentryPMKitForm> {
const SizedBox(height: 4,),
AutoCompletePartsField(
clearAfterPick: false,
initialValue: (model.itemCode?.label ?? "").toString(),
initialValue: (model.itemCode?.name ?? "").toString(),
onPick: (part){
model.itemCode = Lookup(id: int.tryParse(part.id),label: part.code);
},
),
const SizedBox(height: 8,),
const ASubTitle("Item Name"),
const SizedBox(height: 4,),
ATextFormField(
initialValue: (model.itemName ?? "").toString(),
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1,
textInputType: TextInputType.text,
onChange: (value){
model.itemName = value;
},
),
const SizedBox(height: 8,),
const ASubTitle("Preparation Time Frame"),
const SizedBox(height: 4,),
ATextFormField(
initialValue: (model.preparationTimeFrame ?? "").toString(),
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1,
textInputType: TextInputType.text,
onChange: (value){
model.preparationTimeFrame = value;
},
),
const SizedBox(height: 8,),
const ASubTitle("kit Frequency Demand"),
const SizedBox(height: 4,),
ATextFormField(
initialValue: (model.kitFrequencyDemand ?? "").toString(),
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1,
textInputType: TextInputType.text,
onChange: (value){
model.kitFrequencyDemand = value;
},
),
const SizedBox(height: 8,),
const ASubTitle("Availability"),
const SizedBox(height: 4,),
ATextFormField(
initialValue: (model.availability ?? "").toString(),
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1,
textInputType: TextInputType.text,
onChange: (value){
model.availability = value;
},
),
const SizedBox(height: 8,),
const ASubTitle("Quantity Needed"),
const SizedBox(height: 4,),
ATextFormField(
initialValue: (model.quantityNeeded ?? "").toString(),
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1,
textInputType: TextInputType.number,
onChange: (value){
model.quantityNeeded = value;
},
),
const SizedBox(height: 8,),
const ASubTitle("Quantity Reserved"),
const SizedBox(height: 4,),
ATextFormField(
initialValue: (model.quantityReserved ?? "").toString(),
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1,
textInputType: TextInputType.number,
onChange: (value){
model.quantityReserved = value;
model.itemCode = Lookup(id: part.id,name: part.code);
},
),
const SizedBox(height: 8,),
// const ASubTitle("Item Name"),
// const SizedBox(height: 4,),
// ATextFormField(
// initialValue: (model.itemName ?? "").toString(),
// textAlign: TextAlign.center,
// style: Theme.of(context).textTheme.subtitle1,
// textInputType: TextInputType.text,
// onChange: (value){
// model.itemName = value;
// },
// ),
// const SizedBox(height: 8,),
// const ASubTitle("Preparation Time Frame"),
// const SizedBox(height: 4,),
// ATextFormField(
// initialValue: (model.preparationTimeFrame ?? "").toString(),
// textAlign: TextAlign.center,
// style: Theme.of(context).textTheme.subtitle1,
// textInputType: TextInputType.text,
// onChange: (value){
// model.preparationTimeFrame = value;
// },
// ),
// const SizedBox(height: 8,),
// const ASubTitle("kit Frequency Demand"),
// const SizedBox(height: 4,),
// ATextFormField(
// initialValue: (model.kitFrequencyDemand ?? "").toString(),
// textAlign: TextAlign.center,
// style: Theme.of(context).textTheme.subtitle1,
// textInputType: TextInputType.text,
// onChange: (value){
// model.kitFrequencyDemand = value;
// },
// ),
// const SizedBox(height: 8,),
// const ASubTitle("Availability"),
// const SizedBox(height: 4,),
// ATextFormField(
// initialValue: (model.availability ?? "").toString(),
// textAlign: TextAlign.center,
// style: Theme.of(context).textTheme.subtitle1,
// textInputType: TextInputType.text,
// onChange: (value){
// model.availability = value;
// },
// ),
// const SizedBox(height: 8,),
// const ASubTitle("Quantity Needed"),
// const SizedBox(height: 4,),
// ATextFormField(
// initialValue: (model.quantityNeeded ?? "").toString(),
// textAlign: TextAlign.center,
// style: Theme.of(context).textTheme.subtitle1,
// textInputType: TextInputType.number,
// onChange: (value){
// model.quantityNeeded = value;
// },
// ),
// const SizedBox(height: 8,),
// const ASubTitle("Quantity Reserved"),
// const SizedBox(height: 4,),
// ATextFormField(
// initialValue: (model.quantityReserved ?? "").toString(),
// textAlign: TextAlign.center,
// style: Theme.of(context).textTheme.subtitle1,
// textInputType: TextInputType.number,
// onChange: (value){
// model.quantityReserved = value;
// },
// ),
// const SizedBox(height: 8,),
Divider(color: Theme.of(context).textTheme.titleMedium.color,),
],
);

@ -59,7 +59,7 @@ class ServiceRequestItem extends StatelessWidget {
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
request.devicePhotos.isEmpty ? SizedBox.shrink():
request.devicePhotos?.isEmpty != false ? SizedBox.shrink():
Column(
children: [
SizedBox(

@ -2,7 +2,7 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/http_status_manger/http_status_manger.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/service_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
@ -13,7 +13,7 @@ import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/buttons/app_small_button.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import 'package:test_sa/views/widgets/status/employee/employee_mune.dart';
import 'package:test_sa/views/widgets/status/employee/assigned_to_mune.dart';
class ServiceRequestsUpdateDialog extends StatefulWidget {
final ServiceRequest request;
@ -126,7 +126,7 @@ class _ServiceRequestsUpdateDialogState extends State<ServiceRequestsUpdateDialo
],
),
SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),),
EmployeeMenu(
AssignedToMenu(
initialValue: _employee,
onSelect: (employee){
_employee = employee;

@ -44,7 +44,7 @@ class FilterItem extends StatelessWidget {
primary: getStatusColor(),
),
child: Text(
status.label??"",
status.name??"",
style: Theme.of(context).textTheme.bodyText1.copyWith(
color:getStatusColor().computeLuminance() > 0.5
? AColors.black : Colors.white,

@ -1,3 +1,4 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/models/lookup.dart';
@ -7,6 +8,9 @@ import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/buttons/app_button.dart';
import 'package:test_sa/views/widgets/buttons/app_small_button.dart';
import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field.dart';
import 'package:test_sa/views/widgets/status/service_request/service_request_status_mune.dart';
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 '../app_text_form_field.dart';
import 'filter_item.dart';
@ -29,12 +33,12 @@ class _ServiceRequestsSearchDialogState extends State<ServiceRequestsSearchDialo
with TickerProviderStateMixin{
ServiceRequestSearch _search;
List<Lookup> status = [
Lookup(label: "New", id: 4,),
Lookup(name: "New", id: 4,),
Lookup(label: "Repaired", id: 6,),
Lookup(label: "Repeated", id: 8),
Lookup(label: "Closed", id: 9,),
Lookup(label: "Under Repair", id: 5,),
Lookup(name: "Repaired", id: 6,),
Lookup(name: "Repeated", id: 8),
Lookup(name: "Closed", id: 9,),
Lookup(name: "Under Repair", id: 5,),
];
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
@ -55,6 +59,7 @@ class _ServiceRequestsSearchDialogState extends State<ServiceRequestsSearchDialo
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
@ -69,8 +74,9 @@ class _ServiceRequestsSearchDialogState extends State<ServiceRequestsSearchDialo
ASmallButton(
text: _subtitle.search,
onPressed: (){
if(!_formKey.currentState.validate())
if(!_formKey.currentState.validate()) {
return;
}
_formKey.currentState.save();
Navigator.of(context).pop(_search);
},
@ -84,8 +90,9 @@ class _ServiceRequestsSearchDialogState extends State<ServiceRequestsSearchDialo
style: Theme.of(context).textTheme.headline6,
textInputAction: TextInputAction.search,
onAction: (){
if(!_formKey.currentState.validate())
if(!_formKey.currentState.validate()) {
return;
}
_formKey.currentState.save();
Navigator.of(context).pop(_search);
},
@ -95,10 +102,10 @@ class _ServiceRequestsSearchDialogState extends State<ServiceRequestsSearchDialo
),
SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),),
HospitalAutoCompleteField(
initialValue: _search.hospital,
onSave: (value){
_search.hospital = value;
},
initialValue: _search.hospital?.name,
// onSave: (value){
// _search.hospital = value;
// },
onSearch: (value){
_search.hospital = value;
Navigator.of(context).pop(_search);
@ -111,8 +118,9 @@ class _ServiceRequestsSearchDialogState extends State<ServiceRequestsSearchDialo
style: Theme.of(context).textTheme.headline6,
textInputAction: TextInputAction.search,
onAction: (){
if(!_formKey.currentState.validate())
if(!_formKey.currentState.validate()) {
return;
}
_formKey.currentState.save();
Navigator.of(context).pop(_search);
},
@ -127,8 +135,9 @@ class _ServiceRequestsSearchDialogState extends State<ServiceRequestsSearchDialo
style: Theme.of(context).textTheme.headline6,
textInputAction: TextInputAction.search,
onAction: (){
if(!_formKey.currentState.validate())
if(!_formKey.currentState.validate()) {
return;
}
_formKey.currentState.save();
Navigator.of(context).pop(_search);
},
@ -137,36 +146,45 @@ class _ServiceRequestsSearchDialogState extends State<ServiceRequestsSearchDialo
},
),
SizedBox(height: 16 * AppStyle.getScaleFactor(context),),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 12),
child: Wrap(
spacing: 10,
runSpacing: 10,
alignment: WrapAlignment.spaceEvenly,
children: List.generate(
status.length,
(index) {
bool isSelected = _search.statusValue == status[index].id;
return FilterItem(
isSelected: isSelected,
onSelected: (){
if(isSelected)
_search.statusValue = null;
else
_search.statusValue = status[index].id;
setState(() {});
const ASubTitle("Status"),
const SizedBox(height: 4,),
ServiceRequestStatusMenu(
initialValue: _search.statusValue,
onSelect: (status){
_search.statusValue = status;
},
status: status[index],
);
}
),
),
),
// Padding(
// padding: const EdgeInsets.symmetric(horizontal: 12),
// child: Wrap(
// spacing: 10,
// runSpacing: 10,
// alignment: WrapAlignment.spaceEvenly,
// children: List.generate(
// status.length,
// (index) {
// bool isSelected = _search.statusValue == status[index];
// return FilterItem(
// isSelected: isSelected,
// onSelected: (){
// if(isSelected) {
// _search.statusValue = null;
// } else {
// _search.statusValue = status[index];
// }
//
// setState(() {});
// },
// status: status[index],
// );
// }
//
// ),
// ),
// ),
Visibility(
visible: widget.initialSearchValue.toSearchString().isNotEmpty,
visible: widget.initialSearchValue.toMap().isNotEmpty,
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 8,horizontal: 16),
child: AButton(

@ -8,7 +8,10 @@ import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/buttons/app_button.dart';
import 'package:test_sa/views/widgets/buttons/app_small_button.dart';
import 'package:test_sa/views/widgets/date_and_time/from_to_date_bar.dart';
import 'package:test_sa/views/widgets/equipment/auto_complete_models_field.dart';
import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field.dart';
import 'package:test_sa/views/widgets/status/employee/assigned_to_mune.dart';
import 'package:test_sa/views/widgets/status/pentry/pentry_visit_status_mune.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
import '../app_text_form_field.dart';
@ -32,15 +35,15 @@ class _VisitsSearchDialogState extends State<VisitsSearchDialog>
with TickerProviderStateMixin{
VisitsSearch _search;
List<Lookup> status = [
Lookup(label: "Done", id: 0,),
Lookup(label: "Not Yet", id: 1),
Lookup(label: "On Hold", id: 2,),
Lookup(name: "Done", id: 0,),
Lookup(name: "Not Yet", id: 1),
Lookup(name: "On Hold", id: 2,),
];
List<Lookup> contactStatus = [
Lookup(label: "Hospital Employee", key: "H",),
Lookup(label: "Under Warranty", key: "CW"),
Lookup(label: "Under Maintenance Contract", key: "CC",),
// Lookup(name: "Hospital Employee", value: "H",),
// Lookup(name: "Under Warranty", value: "CW"),
// Lookup(name: "Under Maintenance Contract", value: "CC",),
];
@ -61,6 +64,8 @@ class _VisitsSearchDialogState extends State<VisitsSearchDialog>
child: Form(
key: _formKey,
child: ListView(
// shrinkWrap: true,
// physics: const ClampingScrollPhysics(),
padding: const EdgeInsets.symmetric(vertical: 8,horizontal: 16),
children: [
Row(
@ -76,8 +81,9 @@ class _VisitsSearchDialogState extends State<VisitsSearchDialog>
ASmallButton(
text: _subtitle.search,
onPressed: (){
if(!_formKey.currentState.validate())
if(!_formKey.currentState.validate()) {
return;
}
_formKey.currentState.save();
Navigator.of(context).pop(_search);
},
@ -90,8 +96,9 @@ class _VisitsSearchDialogState extends State<VisitsSearchDialog>
style: Theme.of(context).textTheme.headline6,
textInputAction: TextInputAction.search,
onAction: (){
if(!_formKey.currentState.validate())
if(!_formKey.currentState.validate()) {
return;
}
_formKey.currentState.save();
Navigator.of(context).pop(_search);
},
@ -101,99 +108,122 @@ class _VisitsSearchDialogState extends State<VisitsSearchDialog>
),
SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),),
HospitalAutoCompleteField(
initialValue: _search.hospitalName,
onSave: (value){
_search.hospitalName = value;
},
initialValue: _search.hospital?.name,
// onSave: (value){
// _search.hospital = value;
// },
onSearch: (value){
_search.hospitalName = value;
_search.hospital = value;
Navigator.of(context).pop(_search);
},
),
// SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),),
// ATextFormField(
// initialValue: _search.brand,
// hintText: _subtitle.brand,
// style: Theme.of(context).textTheme.headline6,
// textInputAction: TextInputAction.search,
// onAction: (){
// if(!_formKey.currentState.validate()) {
// return;
// }
// _formKey.currentState.save();
// Navigator.of(context).pop(_search);
// },
// onSaved: (value){
// _search.brand = value;
// },
// ),
SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),),
ATextFormField(
initialValue: _search.brand,
hintText: _subtitle.brand,
style: Theme.of(context).textTheme.headline6,
textInputAction: TextInputAction.search,
onAction: (){
if(!_formKey.currentState.validate())
return;
_formKey.currentState.save();
Navigator.of(context).pop(_search);
},
onSaved: (value){
_search.brand = value;
},
),
SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),),
ATextFormField(
AutoCompleteModelField(
initialValue: _search.model,
hintText: _subtitle.model,
style: Theme.of(context).textTheme.headline6,
textInputAction: TextInputAction.search,
onAction: (){
if(!_formKey.currentState.validate())
return;
_formKey.currentState.save();
onPick: (lookup){
_search.model = lookup;
Navigator.of(context).pop(_search);
},
onSaved: (value){
_search.model = value;
},
),
// ATextFormField(
// initialValue: _search.model,
// hintText: _subtitle.model,
// style: Theme.of(context).textTheme.headline6,
// textInputAction: TextInputAction.search,
// onAction: (){
// if(!_formKey.currentState.validate()) {
// return;
// }
// _formKey.currentState.save();
// Navigator.of(context).pop(_search);
// },
// onSaved: (value){
// _search.model = value;
// },
// ),
SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),),
ASubTitle(_subtitle.status),
SizedBox(height: 4.0 * AppStyle.getScaleFactor(context),),
Wrap(
spacing: 10,
runSpacing: 10,
children: List.generate(
status.length,
(index) {
bool isSelected = _search.statusValue == status[index].id;
return FilterItem(
isSelected: isSelected,
onSelected: (){
if(isSelected)
_search.statusValue = null;
else
_search.statusValue = status[index].id;
setState(() {});
PentryVisitsStatusMenu(
initialValue: _search.statusValue,
onSelect: (status){
_search.statusValue = status;
},
status: status[index],
);
}
),
),
// Wrap(
// spacing: 10,
// runSpacing: 10,
// children: List.generate(
// status.length,
// (index) {
// bool isSelected = _search.statusValue == status[index].id;
// return FilterItem(
// isSelected: isSelected,
// onSelected: (){
// if(isSelected) {
// _search.statusValue = null;
// } else {
// _search.statusValue = status[index].id;
// }
//
// setState(() {});
// },
// status: status[index],
// );
// }
//
// ),
// ),
SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),),
ASubTitle(_subtitle.contactStatus),
SizedBox(height: 4.0 * AppStyle.getScaleFactor(context),),
Wrap(
spacing: 10,
runSpacing: 10,
children: List.generate(
contactStatus.length,
(index) {
bool isSelected = _search.contactStatus == contactStatus[index].key;
return FilterItem(
isSelected: isSelected,
onSelected: (){
if(isSelected)
_search.contactStatus = null;
else
_search.contactStatus = contactStatus[index].key;
setState(() {});
AssignedToMenu(
initialValue: _search.contactStatus,
onSelect: (status){
_search.contactStatus = status;
},
status: contactStatus[index],
);
}
),
),
// Wrap(
// spacing: 10,
// runSpacing: 10,
// children: List.generate(
// contactStatus.length,
// (index) {
// bool isSelected = _search.contactStatus == contactStatus[index];
// return FilterItem(
// isSelected: isSelected,
// onSelected: (){
// if(isSelected) {
// _search.contactStatus = null;
// } else {
// _search.contactStatus = contactStatus[index];
// }
//
// setState(() {});
// },
// status: contactStatus[index],
// );
// }
//
// ),
// ),
SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),),
ASubTitle(_subtitle.actualDate),
SizedBox(height: 4.0 * AppStyle.getScaleFactor(context),),
@ -221,7 +251,7 @@ class _VisitsSearchDialogState extends State<VisitsSearchDialog>
},
),
Visibility(
visible: _search.toSearchString().isNotEmpty,
visible: _search.toMap().isNotEmpty,
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 8,horizontal: 16),
child: AButton(

@ -1,21 +1,21 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/employee/employee_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/employee/assigned_to_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';
class EmployeeMenu extends StatelessWidget {
class AssignedToMenu extends StatelessWidget {
final Function(Lookup) onSelect;
final Lookup initialValue;
const EmployeeMenu({Key key, this.onSelect, this.initialValue}) : super(key: key);
const AssignedToMenu({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<EmployeesProvider>(context);
final menuProvider = Provider.of<AssignedToProvider>(context);
return LoadingManager(
isLoading: menuProvider.isLoading,
isFailedLoading: menuProvider.items == null,

@ -0,0 +1,37 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/employee/engineers_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/engineer.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/status/employee/single_type_menu.dart';
class EngineersMenu extends StatelessWidget {
final Function(Engineer) onSelect;
final Engineer initialValue;
const EngineersMenu({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<EngineersProvider>(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: SingleEngineerMenu(
initialStatus: initialValue,
engineers: menuProvider.items,
onSelect: onSelect,
)
);
}
}

@ -0,0 +1,99 @@
import 'package:flutter/material.dart';
import 'package:test_sa/models/engineer.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart';
class SingleEngineerMenu extends StatefulWidget {
final List<Engineer> engineers;
final Engineer initialStatus;
final Function(Engineer) onSelect;
const SingleEngineerMenu({Key key, this.engineers, this.onSelect, this.initialStatus}) : super(key: key);
@override
_SingleEngineerMenuState createState() => _SingleEngineerMenuState();
}
class _SingleEngineerMenuState extends State<SingleEngineerMenu> {
Engineer _selectedStatus;
@override
void didUpdateWidget(covariant SingleEngineerMenu oldWidget) {
if(widget.initialStatus != null && widget.initialStatus.id != null){
_selectedStatus = widget.engineers?.firstWhere(
(element) {
return element == widget.initialStatus;
});
widget.onSelect(_selectedStatus);
} else {
_selectedStatus = null;
}
super.didUpdateWidget(oldWidget);
}
@override
void initState() {
if(widget.initialStatus != null && widget.initialStatus.id != null){
_selectedStatus = widget.engineers?.firstWhere(
(element) {
return element == widget.initialStatus;
});
widget.onSelect(_selectedStatus);
}
super.initState();
}
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.symmetric(
horizontal: 16
),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color:AColors.black),
borderRadius: BorderRadius.circular(
AppStyle.borderRadius * AppStyle.getScaleFactor(context)
),
boxShadow: const [
AppStyle.boxShadow
]
),
child: DropdownButton<Engineer>(
value: _selectedStatus,
iconSize: 24,
elevation: 16,
isExpanded: true,
hint: Text(
"Select",
style: Theme.of(context).textTheme.subtitle1,
),
style: TextStyle(
color: Theme.of(context).primaryColor
),
underline: SizedBox.shrink(),
onChanged: (Engineer newValue) {
setState(() {
_selectedStatus = newValue;
});
widget.onSelect(newValue);
},
items: widget.engineers
.map<DropdownMenuItem<Engineer>>((Engineer value) {
return DropdownMenuItem<Engineer>(
value: value,
child: Text(
value.name,
style: Theme.of(context).textTheme.subtitle1.copyWith(
color: Theme.of(context).primaryColor,
fontSize: 11,
//fontWeight: FontWeight.bold
),
),
);
})
.toList(),
),
);
}
}

@ -0,0 +1,38 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_type_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';
class GasCylinderTypesMenu extends StatelessWidget {
final Function(Lookup) onSelect;
final Lookup initialValue;
const GasCylinderTypesMenu({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<GasCylinderTypesProvider>(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,
)
);
}
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save