Merge remote-tracking branch 'atoms_main/main' into main_latest_merged

# Conflicts:
#	lib/controllers/api_routes/urls.dart
#	lib/controllers/providers/api/departments_provider.dart
#	lib/controllers/providers/api/device_transfer_provider.dart
#	lib/controllers/providers/api/devices_provider.dart
#	lib/controllers/providers/api/gas_refill_provider.dart
#	lib/controllers/providers/api/hospitals_provider.dart
#	lib/controllers/providers/api/parts_provider.dart
#	lib/controllers/providers/api/regular_visits_provider.dart
#	lib/controllers/providers/api/service_requests_provider.dart
#	lib/controllers/providers/api/status_drop_down/employee/assigned_to_provider.dart
#	lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart
#	lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart
#	lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart
#	lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart
#	lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart
#	lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart
#	lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart
#	lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart
#	lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart
#	lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart
#	lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart
#	lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart
#	lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart
#	lib/main.dart
#	lib/models/device/device.dart
#	lib/models/device/device_transfer.dart
#	lib/models/device/device_transfer_info.dart
#	lib/models/gas_refill/gas_refill_details.dart
#	lib/models/gas_refill/gas_refill_model.dart
#	lib/models/lookup.dart
#	lib/models/pantry/calibration_tools.dart
#	lib/models/pantry/lookups/contact_person.dart
#	lib/models/pantry/lookups/contact_title.dart
#	lib/models/pantry/pentry.dart
#	lib/models/pantry/pm_kit.dart
#	lib/models/pantry/ppm_check_list.dart
#	lib/models/service_report.dart
#	lib/models/service_request/service_request.dart
#	lib/models/user.dart
#	lib/models/visits/visit.dart
#	lib/models/visits/visits_group.dart
#	lib/views/app_style/colors.dart
#	lib/views/pages/login.dart
#	lib/views/pages/register.dart
#	lib/views/pages/splash_screen.dart
#	lib/views/pages/user/land_page.dart
#	lib/views/pages/user/requests/create_request.dart
#	lib/views/pages/user/requests/report/create_service_report.dart
#	lib/views/pages/user/requests/report/edit_service_report.dart
#	lib/views/pages/user/requests/request_details.dart
#	lib/views/pages/user/visits/pantry/edit_pentry.dart
#	lib/views/pages/user/visits/preventive_maintenance_visits_page.dart
#	lib/views/pages/user/visits/regular_visits_page.dart
#	lib/views/pages/user/visits/update_visits_group_sheet.dart
#	lib/views/pages/user/visits/visit_details.dart
#	lib/views/widgets/app_text_form_field.dart
#	lib/views/widgets/buttons/app_back_button.dart
#	lib/views/widgets/departments/department_button.dart
#	lib/views/widgets/drawer/drawer_item.dart
#	lib/views/widgets/equipment/auto_complete_devices_field.dart
#	lib/views/widgets/equipment/device_button.dart
#	lib/views/widgets/equipment/single_device_picker.dart
#	lib/views/widgets/hospitals/hospital_auto_complete_field.dart
#	lib/views/widgets/hospitals/hospital_button.dart
#	lib/views/widgets/images/multi_image_picker.dart
#	lib/views/widgets/loaders/loading_manager.dart
#	lib/views/widgets/parts/auto_complete_parts_field.dart
#	lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart
#	lib/views/widgets/pentry/pentry_calibration_tool_form.dart
#	lib/views/widgets/pentry/pentry_info_form.dart
#	lib/views/widgets/pentry/pentry_pm_kit_form.dart
#	lib/views/widgets/requests/service_request_update_dialog.dart
#	lib/views/widgets/search/service_request_search_bar.dart
#	lib/views/widgets/search/visits_search_bar.dart
#	lib/views/widgets/sound/record_sound.dart
#	lib/views/widgets/sound/sound_player.dart
#	lib/views/widgets/speech_to_text/speech_to_text.dart
#	lib/views/widgets/status/employee/assigned_to_mune.dart
#	lib/views/widgets/status/multi_status_menu.dart
#	lib/views/widgets/status/report/service_status.dart
#	lib/views/widgets/status/single_status_menu.dart
#	lib/views/widgets/timer/app_timer.dart
#	lib/views/widgets/visits/visit_item.dart
#	pubspec.yaml
merge-requests/22/head
Sikander Saleem 3 years ago
commit c5c96a4fce

@ -0,0 +1,150 @@
import 'dart:convert';
import 'dart:developer';
import 'package:flutter/cupertino.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:http/http.dart' as http;
import 'package:http/http.dart';
import 'package:test_sa/models/user.dart';
class ApiManager {
ApiManager._();
Map<String,String> get _headers => {
'Content-Type': 'application/json',
if(user != null) 'Authorization': 'Bearer ${user.token}',
};
static ApiManager instance = ApiManager._();
User user;
Future<http.Response> get(
String url,
{Map<String,String> headers,}
) async{
headers ??= {};
headers.addAll(_headers);
Uri _url = Uri.parse(url);
// print(_url);
// print(headers);
http.Response response = await http.get(_url,headers: headers);
if(jsonDecode(response.body) is Map<String,dynamic>){
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);
// log(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);
// log(response.body);
if(jsonDecode(response.body) is Map<String,dynamic>){
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);
// log(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);
// log(response.body);
if(jsonDecode(response.body) is Map<String,dynamic>){
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);
// log(response.body);
if(jsonDecode(response.body) is Map<String,dynamic>){
final message = jsonDecode(response.body)["message"];
if(message != null && message.toString().isNotEmpty){
Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG);
}
}
return response;
}
}

@ -1,5 +1,5 @@
import 'package:test_sa/models/subtitle.dart';
import 'package:meta/meta.dart'; import 'package:meta/meta.dart';
import 'package:test_sa/models/subtitle.dart';
class HttpStatusManger{ class HttpStatusManger{
static String getStatusMessage({ static String getStatusMessage({

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

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

@ -2,6 +2,7 @@ import 'dart:convert';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/device/device_transfer.dart'; import 'package:test_sa/models/device/device_transfer.dart';
import 'package:test_sa/models/device/device_transfer_info.dart'; import 'package:test_sa/models/device/device_transfer_info.dart';
@ -64,19 +65,19 @@ class DeviceTransferProvider extends ChangeNotifier{
// return 200; // return 200;
Response response; Response response;
try{ try{
response = await get( Map<String,dynamic> body = {};
Uri.parse( body["pageNumber"] = (items?.length ?? 0) ~/pageItemNumber + 1;
"$host${URLs.getDeviceTransfer}?uid=${user.id}" body["pageSize"] = pageItemNumber;
"&token=${user.token}&page=${(items?.length ?? 0) ~/pageItemNumber}"
), response = await ApiManager.instance.post(
headers: { URLs.getDeviceTransfer,
"Content-Type":"application/json; charset=utf-8" body: body,
}
); );
stateCode = response.statusCode; stateCode = response.statusCode;
if(stateCode >= 200 && stateCode < 300) { if(stateCode >= 200 && stateCode < 300) {
// client's request was successfully received // 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( List<DeviceTransfer> itemsPage = listJson.map(
(request) => DeviceTransfer.fromJson(request)).toList(); (request) => DeviceTransfer.fromJson(request)).toList();
items ??= []; items ??= [];
@ -106,20 +107,20 @@ class DeviceTransferProvider extends ChangeNotifier{
@required DeviceTransfer model, @required DeviceTransfer model,
}) async { }) async {
Map<String,dynamic> body = { Map<String,dynamic> body = {
"uid": user.id.toString(), // "uid": user.id.toString(),
"token": user.token ?? "", // "token": user.token ?? "",
"serial_id": model.device.id ?? "", "assetId": model.device.id ?? "",
"destination_client": model.receiver.client.id ?? "", "destSiteId": model.receiver.client.id ?? "",
"destination_department": model.receiver.department.id ?? "", "destDepartmentId": model.receiver.department.id ?? "",
"senderSiteId": model.receiver.client.id ?? "",
}; };
Response response; Response response;
try{ try{
response = await post( response = await ApiManager.instance.post(
Uri.parse( URLs.requestDeviceTransfer,
host+URLs.requestDeviceTransfer), body: body
body: body,
); );
stateCode = response.statusCode; stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) { if(response.statusCode >= 200 && response.statusCode < 300) {
@ -145,24 +146,59 @@ class DeviceTransferProvider extends ChangeNotifier{
@required String host, @required String host,
@required User user, @required User user,
@required bool isSender, @required bool isSender,
@required String requestId, @required int requestId,
@required DeviceTransfer oldModel, @required DeviceTransfer oldModel,
@required DeviceTransferInfo newModel, @required DeviceTransferInfo newModel,
}) async { }) async {
Map<String,dynamic> body = { Map<String,dynamic> body = {
"uid": user.id.toString(), "id": oldModel.id,
"token": user.token ?? "", "assetId": oldModel.device.id ?? "",
"current_user": user.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)); body.addAll(newModel.toJson(isSender));
Response response; Response response;
try{ try{
response = await post( response = await ApiManager.instance.put(
Uri.parse("$host${URLs.updateDeviceTransfer}/$requestId"), URLs.updateDeviceTransfer,
body: body, body: body
); );
// response = await post(
// Uri.parse("$host${URLs.updateDeviceTransfer}/$requestId"),
// body: body,
// );
stateCode = response.statusCode; stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) { if(response.statusCode >= 200 && response.statusCode < 300) {
reset(); reset();

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

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

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

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

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

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

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

@ -2,8 +2,9 @@ import 'dart:convert';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/http_status_manger.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart';
import 'package:test_sa/models/issue.dart'; import 'package:test_sa/models/issue.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_report.dart';
@ -51,36 +52,33 @@ class ServiceRequestsProvider extends ChangeNotifier{
Future<int> getRequests ({ Future<int> getRequests ({
@required String host, @required String host,
@required User user, @required User user,
@required String hospitalId, @required int hospitalId,
}) async { }) async {
if(isLoading == true) if(isLoading == true)
return -2; return -2;
isLoading = true; isLoading = true;
if(serviceRequests == null) notifyListeners();
Response response; Response response;
try{ try{
response = await get( Map<String,dynamic> body = {};
Uri.parse( body.addAll(search.toMap());
host+URLs.getServiceRequests body["pageNumber"] = (serviceRequests?.length ?? 0) ~/pageItemNumber + 1;
+"?uid=${user.id}" body["pageSize"] = pageItemNumber;
+(hospitalId == null? "" :"&client_nid=$hospitalId")
+"&token=${user.token}" response = await ApiManager.instance.post(
"&page=${(serviceRequests?.length ?? 0) ~/pageItemNumber}" URLs.getServiceRequests,
+search?.toSearchString() ?? "" body: body,
),
headers: {
"Content-Type":"application/json; charset=utf-8"
}
); );
stateCode = response.statusCode; stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) { if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received
List requestsListJson = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); List requestsListJson = json.decode(response.body)["data"];
List<ServiceRequest> _serviceRequestsPage = requestsListJson.map( List<ServiceRequest> serviceRequestsPage = requestsListJson.map(
(request) => ServiceRequest.fromJson(request)).toList(); (request) => ServiceRequest.fromJson(request)).toList();
if(serviceRequests == null) serviceRequests ??= [];
serviceRequests = []; serviceRequests.addAll(serviceRequestsPage);
serviceRequests.addAll(_serviceRequestsPage); if(serviceRequestsPage.length == pageItemNumber){
if(_serviceRequestsPage.length == pageItemNumber){
nextPage = true; nextPage = true;
}else{ }else{
nextPage = false; nextPage = false;
@ -144,25 +142,29 @@ class ServiceRequestsProvider extends ChangeNotifier{
}) async { }) async {
var body = { var body = {
"uid": user.id, "callCreatedBy": {
"token": user.token ?? "", "id":user.id,
"sn_id": serviceRequest.deviceId ?? "", "name":user.userName
"date": (DateTime.now().millisecondsSinceEpoch).toString(), },
"client": user.hospital.id ?? '', "assets":serviceRequest.deviceId == null ? [] : [serviceRequest.deviceId],
"complaint": serviceRequest.maintenanceIssue, "requestedDate": DateTime.now().toIso8601String(),
"image": json.encode(serviceRequest.devicePhotos), "requestedTime": DateTime.now().toIso8601String(),
"priority": (serviceRequest.priority?.id).toString(), "client": user.hospital?.id ?? '',
"defect_types": (serviceRequest.defectType?.id).toString(), "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){ if(serviceRequest.audio != null){
body["audio"] = serviceRequest.audio; body["voiceNote"] = serviceRequest.audio;
} }
Response response; Response response;
try{ try{
response = await post( response = await ApiManager.instance.post(
Uri.parse( URLs.createRequest,
host+URLs.createRequest), body: body
body: body,
); );
stateCode = response.statusCode; stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) { if(response.statusCode >= 200 && response.statusCode < 300) {
@ -232,7 +234,7 @@ class ServiceRequestsProvider extends ChangeNotifier{
); );
stateCode = response.statusCode; stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) { if(response.statusCode >= 200 && response.statusCode < 300) {
request.engineerName = employee.label; request.engineerName = employee.name;
notifyListeners(); notifyListeners();
} }
return response.statusCode; return response.statusCode;
@ -250,16 +252,20 @@ class ServiceRequestsProvider extends ChangeNotifier{
@required ServiceRequest request, @required ServiceRequest request,
}) async { }) async {
Response response; Response response;
Map<String,String> body = report.toMap();
body["uid"] = user.id;
body["token"] = user.token;
body["job_id"] = request.id;
try{ try{
response = await post( Map<String,dynamic> body = report.toMap(request);
Uri.parse( // body["uid"] = user.id;
host+URLs.createServiceReport), // body["token"] = user.token;
body: body, response = await ApiManager.instance.post(
URLs.createServiceReport,
body: body
); );
// response = await post(
// Uri.parse(
// host+URLs.createServiceReport),
// body: body,
// );
stateCode = response.statusCode; stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) { if(response.statusCode >= 200 && response.statusCode < 300) {
@ -269,7 +275,6 @@ class ServiceRequestsProvider extends ChangeNotifier{
return response.statusCode; return response.statusCode;
} catch(error) { } catch(error) {
return -1; return -1;
} }
@ -317,18 +322,25 @@ class ServiceRequestsProvider extends ChangeNotifier{
@required ServiceRequest request, @required ServiceRequest request,
}) async { }) async {
Response response; Response response;
Map<String,String> body = report.toMap(); //Map<String,dynamic> body = report.toMap(request);
body["uid"] = user.id; // body["uid"] = user.id;
body["token"] = user.token; // body["token"] = user.token;
body["job_id"] = request.id; // body["job_id"] = request.id;
body["report_id"] = request.reportID; // body["report_id"] = request.reportID;
try{ try{
response = await post( Map<String,dynamic> body = report.toMap(request);
Uri.parse( // body["uid"] = user.id;
host+URLs.updateServiceReport), // body["token"] = user.token;
body: body, response = await ApiManager.instance.put(
URLs.updateServiceReport,
body: body
); );
stateCode = response.statusCode; // response = await post(
// Uri.parse(
// host+URLs.updateServiceReport),
// body: body,
// );
// stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) { if(response.statusCode >= 200 && response.statusCode < 300) {
reset(); reset();
@ -337,7 +349,6 @@ class ServiceRequestsProvider extends ChangeNotifier{
return response.statusCode; return response.statusCode;
} catch(error) { } catch(error) {
return -1; return -1;
} }
@ -350,7 +361,7 @@ class ServiceRequestsProvider extends ChangeNotifier{
@required ServiceRequest request, @required ServiceRequest request,
}) async { }) async {
Response response; Response response;
Map<String,String> body = {}; Map<String,dynamic> body = {};
body["uid"] = user.id; body["uid"] = user.id;
body["token"] = user.token; body["token"] = user.token;
body["job_id"] = request.id; body["job_id"] = request.id;
@ -380,26 +391,17 @@ class ServiceRequestsProvider extends ChangeNotifier{
} }
Future<ServiceReport> getSingleServiceReport({ Future<ServiceReport> getSingleServiceReport({
@required String reportId, @required int reportId,
@required String host, @required String host,
@required User user, @required User user,
@required Subtitle subtitle, @required Subtitle subtitle,
}) async { }) async {
String userData = '';
if(user != null){
userData += "&uid="+user.id;
userData += "&token="+user.token;
}
Response response; Response response;
try{ try{
response = await ApiManager.instance.get(
response = await get( URLs.getServiceReport + "?workOrderId=$reportId",
Uri.parse( );
host+URLs.getServiceReport
+'?report_id=$reportId'
'$userData',)
);
}catch(error){ }catch(error){
throw(HttpStatusManger.getStatusMessage( throw(HttpStatusManger.getStatusMessage(
@ -410,7 +412,7 @@ class ServiceRequestsProvider extends ChangeNotifier{
if (response.statusCode >= 200 && response.statusCode < 300){ if (response.statusCode >= 200 && response.statusCode < 300){
// If the call to the server was successful, parse the JSON. // If the call to the server was successful, parse the JSON.
return ServiceReport.fromJson( return ServiceReport.fromJson(
json.decode(utf8.decode(response.bodyBytes)),reportId); json.decode(response.body)["data"],reportId);
}else{ }else{
throw(HttpStatusManger.getStatusMessage( throw(HttpStatusManger.getStatusMessage(
status: response.statusCode, subtitle: subtitle)); status: response.statusCode, subtitle: subtitle));

@ -3,11 +3,12 @@ import 'dart:convert';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
class EmployeesProvider extends ChangeNotifier{ class AssignedToProvider extends ChangeNotifier{
//reset provider data //reset provider data
void reset(){ void reset(){
@ -48,21 +49,19 @@ class EmployeesProvider extends ChangeNotifier{
notifyListeners(); notifyListeners();
Response response; Response response;
try{ try{
response = await get( response = await ApiManager.instance.get(
Uri.parse( URLs.getEmployees,
host + URLs.getEmployees),
); );
_stateCode = response.statusCode; _stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) { if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // 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(); _items = categoriesListJson.map((type) => Lookup.fromJson(type)).toList();
} }
_loading = false; _loading = false;
notifyListeners(); notifyListeners();
return response.statusCode; return response.statusCode;
} catch(error) { } catch(error) {
_loading = false; _loading = false;
_stateCode = -1; _stateCode = -1;
notifyListeners(); notifyListeners();

@ -0,0 +1,73 @@
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) {
_loading = false;
_stateCode = -1;
notifyListeners();
return -1;
}
}
}

@ -3,6 +3,7 @@ import 'dart:convert';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
@ -49,13 +50,13 @@ class GasCylinderSizesProvider extends ChangeNotifier{
notifyListeners(); notifyListeners();
Response response; Response response;
try{ try{
response = await get( response = await ApiManager.instance.get(
Uri.parse(host + URLs.getGasCylinderSize), URLs.getGasCylinderSize,
); );
_stateCode = response.statusCode; _stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) { if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // 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(); _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList();
} }
_loading = false; _loading = false;

@ -0,0 +1,74 @@
import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class 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;
}
}
}

@ -6,6 +6,10 @@ import 'package:test_sa/models/user.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class GasStatusProvider extends ChangeNotifier{ class GasStatusProvider extends ChangeNotifier{
@ -48,13 +52,13 @@ class GasStatusProvider extends ChangeNotifier{
notifyListeners(); notifyListeners();
Response response; Response response;
try{ try{
response = await get( response = await ApiManager.instance.get(
Uri.parse(host + URLs.getGasStatus), URLs.getGasStatus,
); );
_stateCode = response.statusCode; _stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) { if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // 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(); _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList();
} }
_loading = false; _loading = false;

@ -6,6 +6,10 @@ import 'package:test_sa/models/user.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class GasTypesProvider extends ChangeNotifier{ class GasTypesProvider extends ChangeNotifier{
@ -48,13 +52,13 @@ class GasTypesProvider extends ChangeNotifier{
notifyListeners(); notifyListeners();
Response response; Response response;
try{ try{
response = await get( response = await ApiManager.instance.get(
Uri.parse(host + URLs.getGasTypes), URLs.getGasTypes,
); );
_stateCode = response.statusCode; _stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) { if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // 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(); _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList();
} }
_loading = false; _loading = false;

@ -3,6 +3,7 @@ import 'dart:convert';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
@ -48,16 +49,15 @@ class PentryStatusProvider extends ChangeNotifier{
notifyListeners(); notifyListeners();
Response response; Response response;
try{ try{
response = await get( response = await ApiManager.instance.get(
Uri.parse( URLs.getPentryStatus,
host + URLs.getPentryStatus),
); );
_stateCode = response.statusCode; _stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) { if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received
List listJson = json.decode(utf8.decode(response.bodyBytes)); List listJson = json.decode(response.body)["data"];
_items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList(); _items = listJson.map((type) => Lookup.fromJson(type)).toList();
} }
_loading = false; _loading = false;
notifyListeners(); notifyListeners();

@ -3,6 +3,7 @@ import 'dart:convert';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
@ -48,16 +49,15 @@ class PentryTaskStatusProvider extends ChangeNotifier{
notifyListeners(); notifyListeners();
Response response; Response response;
try{ try{
response = await get( response = await ApiManager.instance.get(
Uri.parse( URLs.getPentryTaskStatus,
host + URLs.getPentryTaskStatus),
); );
_stateCode = response.statusCode; _stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) { if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // 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.fromIntIdJson(type)).toList(); _items = categoriesListJson.map((type) => Lookup.fromJson(type)).toList();
} }
_loading = false; _loading = false;
notifyListeners(); notifyListeners();

@ -3,6 +3,7 @@ import 'dart:convert';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
@ -48,16 +49,15 @@ class PentryVisitStatusProvider extends ChangeNotifier{
notifyListeners(); notifyListeners();
Response response; Response response;
try{ try{
response = await get( response = await ApiManager.instance.get(
Uri.parse( URLs.getPentryVisitStatus,
host + URLs.getPentryVisitStatus),
); );
_stateCode = response.statusCode; _stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) { if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received
List listJson = json.decode(utf8.decode(response.bodyBytes)); List listJson = json.decode(response.body)["data"];
_items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList(); _items = listJson.map((type) => Lookup.fromJson(type)).toList();
} }
_loading = false; _loading = false;
notifyListeners(); notifyListeners();

@ -3,6 +3,7 @@ import 'dart:convert';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
@ -48,16 +49,14 @@ class ServiceRequestDefectTypesProvider extends ChangeNotifier{
notifyListeners(); notifyListeners();
Response response; Response response;
try{ try{
response = await get( response = await ApiManager.instance.get(
Uri.parse( URLs.getServiceReportDefectTypes,
host + URLs.getServiceReportDefectTypes),
); );
_stateCode = response.statusCode; _stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) { if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received
List listJson = json.decode(utf8.decode(response.bodyBytes)); List listJson = json.decode(response.body)["data"];
_items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList(); _items = listJson.map((type) => Lookup.fromJson(type)).toList();
} }
_loading = false; _loading = false;
notifyListeners(); notifyListeners();

@ -3,6 +3,7 @@ import 'dart:convert';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
@ -42,24 +43,28 @@ class ServiceReportLastCallsProvider extends ChangeNotifier{
/// return state code if request complete may be 200, 404 or 403 /// return state code if request complete may be 200, 404 or 403
/// for more details check http state manager /// for more details check http state manager
/// lib\controllers\http_status_manger\http_status_manger.dart /// lib\controllers\http_status_manger\http_status_manger.dart
Future<int> getCalls ({String host,User user,String serviceStatus}) async { Future<int> getCalls ({String host,User user,int serviceStatus}) async {
if(_loading == true) if(_loading == true)
return -2; return -2;
_loading = true; _loading = true;
notifyListeners(); notifyListeners();
Response response; Response response;
try{ try{
response = await get( // todo request new api from backend to make filter work
Uri.parse( response = await ApiManager.instance.get(
host + URLs.getServiceReportLastCalls URLs.getServiceReportLastCalls,
+(serviceStatus == null ? "" : "?service_status=$serviceStatus")
),
); );
// response = await get(
// Uri.parse(
// URLs.getServiceReportLastCalls
// +(serviceStatus == null ? "" : "?service_status=$serviceStatus")
// ),
// );
_stateCode = response.statusCode; _stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) { if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received
List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); List categoriesListJson = json.decode(response.body)["data"];
_calls = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList(); _calls = categoriesListJson.map((type) => Lookup.fromJson(type)).toList();
} }
_loading = false; _loading = false;
notifyListeners(); notifyListeners();

@ -3,6 +3,7 @@ import 'dart:convert';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
@ -48,16 +49,15 @@ class ServiceRequestPriorityProvider extends ChangeNotifier{
notifyListeners(); notifyListeners();
Response response; Response response;
try{ try{
response = await get( response = await ApiManager.instance.get(
Uri.parse( URLs.getServiceReportPriority,
host + URLs.getServiceReportPriority),
); );
_stateCode = response.statusCode; _stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) { if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received
List listJson = json.decode(utf8.decode(response.bodyBytes)); List listJson = json.decode(response.body)["data"];
_items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList(); _items = listJson.map((type) => Lookup.fromJson(type)).toList();
} }
_loading = false; _loading = false;
notifyListeners(); notifyListeners();

@ -3,6 +3,7 @@ import 'dart:convert';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
@ -48,15 +49,14 @@ class ServiceReportReasonsProvider extends ChangeNotifier{
notifyListeners(); notifyListeners();
Response response; Response response;
try{ try{
response = await get( response = await ApiManager.instance.get(
Uri.parse( URLs.getServiceReportReasons,
host + URLs.getServiceReportReasons),
); );
_stateCode = response.statusCode; _stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) { if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received
List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); List categoriesListJson = json.decode(response.body)["data"];
_reasons = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList(); _reasons = categoriesListJson.map((type) => Lookup.fromJson(type)).toList();
} }
_loading = false; _loading = false;
notifyListeners(); notifyListeners();

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

@ -3,6 +3,7 @@ import 'dart:convert';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
@ -48,16 +49,14 @@ class ServiceReportTypesProvider extends ChangeNotifier{
notifyListeners(); notifyListeners();
Response response; Response response;
try{ try{
response = await ApiManager.instance.get(
response = await get( URLs.getServiceReportTypes,
Uri.parse(
host + URLs.getServiceReportTypes),
); );
_stateCode = response.statusCode; _stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) { if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received
List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); List categoriesListJson = json.decode(response.body)["data"];
_types = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList(); _types = categoriesListJson.map((type) => Lookup.fromJson(type)).toList();
} }
_loading = false; _loading = false;
notifyListeners(); notifyListeners();

@ -3,6 +3,7 @@ import 'dart:convert';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
@ -48,16 +49,14 @@ class ServiceStatusProvider extends ChangeNotifier{
notifyListeners(); notifyListeners();
Response response; Response response;
try{ try{
response = await ApiManager.instance.get(
response = await get( URLs.getAssetTypes,
Uri.parse(
host + URLs.getServiceTypes),
); );
_stateCode = response.statusCode; _stateCode = response.statusCode;
if(response.statusCode >= 200 && response.statusCode < 300) { if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received
List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); List categoriesListJson = json.decode(response.body)["data"];
_statuses = categoriesListJson.map((e) => Lookup.fromIntIdJson(e)).toList(); _statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList();
} }
_loading = false; _loading = false;

@ -0,0 +1,74 @@
import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class 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:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class 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:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/user.dart';
class 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,15 +1,17 @@
import 'dart:convert'; import 'dart:convert';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/user.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/user.dart';
class UserProvider extends ChangeNotifier{ class UserProvider extends ChangeNotifier{
//reset provider data //reset provider data
void reset(){ void reset(){
_user = null; _user = null;
ApiManager.instance.user = user;
_loading = false; _loading = false;
} }
@ -19,6 +21,7 @@ class UserProvider extends ChangeNotifier{
User get user => _user; User get user => _user;
set user(User user) { set user(User user) {
_user = user; _user = user;
ApiManager.instance.user = user;
notifyListeners(); notifyListeners();
} }
@ -48,17 +51,15 @@ class UserProvider extends ChangeNotifier{
notifyListeners(); notifyListeners();
Response response; Response response;
try{ try{
response = await post( response = await ApiManager.instance.post(
Uri.parse( URLs.login,
host+URLs.login), body: await user.toLoginJson(),
body: await user.toLoginJson(),
); );
_loading = false; _loading = false;
if(response.statusCode >= 200 && response.statusCode < 300) { if(response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received // client's request was successfully received
_user = User.fromJson(jsonDecode(utf8.decode(response.bodyBytes))[0]); _user = User.fromJson(jsonDecode(response.body));
ApiManager.instance.user = _user;
return response.statusCode; return response.statusCode;
} }
notifyListeners(); notifyListeners();
@ -86,10 +87,9 @@ class UserProvider extends ChangeNotifier{
notifyListeners(); notifyListeners();
Response response; Response response;
try{ try{
response = await post( response = await ApiManager.instance.post(
Uri.parse( URLs.register,
host+URLs.register), body: await user.toLoginJson(),
body: await user.toRegisterJson()
); );
} catch(error) { } catch(error) {
_loading = false; _loading = false;
@ -134,10 +134,9 @@ class UserProvider extends ChangeNotifier{
if(user.phoneNumber != _user.phoneNumber) if(user.phoneNumber != _user.phoneNumber)
jsonObject["phone"] = user.phoneNumber; jsonObject["phone"] = user.phoneNumber;
try{ try{
response = await post( response = response = await ApiManager.instance.post(
Uri.parse( URLs.login,
host+URLs.updateProfile), body: jsonObject,
body: jsonObject
); );
} catch(error) { } catch(error) {
_loading = false; _loading = false;

@ -1,3 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:provider/provider.dart';
import 'dart:io'; import 'dart:io';
import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_core/firebase_core.dart';
@ -13,14 +16,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/notifications_provider.dart';
import 'package:test_sa/controllers/providers/api/regular_visits_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/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_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_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/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_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/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_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/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/app_style/colors.dart';
import 'package:test_sa/views/pages/login.dart'; import 'package:test_sa/views/pages/login.dart';
import 'package:test_sa/views/pages/register.dart'; import 'package:test_sa/views/pages/register.dart';
@ -92,16 +100,21 @@ class MyApp extends StatelessWidget {
ChangeNotifierProvider(create: (_) => ServiceStatusProvider()), ChangeNotifierProvider(create: (_) => ServiceStatusProvider()),
ChangeNotifierProvider(create: (_) => ServiceReportLastCallsProvider()), ChangeNotifierProvider(create: (_) => ServiceReportLastCallsProvider()),
ChangeNotifierProvider(create: (_) => GasCylinderSizesProvider()), ChangeNotifierProvider(create: (_) => GasCylinderSizesProvider()),
ChangeNotifierProvider(create: (_) => GasCylinderTypesProvider()),
ChangeNotifierProvider(create: (_) => GasStatusProvider()), ChangeNotifierProvider(create: (_) => GasStatusProvider()),
ChangeNotifierProvider(create: (_) => GasTypesProvider()), ChangeNotifierProvider(create: (_) => GasTypesProvider()),
ChangeNotifierProvider(create: (_) => GasRefillProvider()), ChangeNotifierProvider(create: (_) => GasRefillProvider()),
ChangeNotifierProvider(create: (_) => DeviceTransferProvider()), ChangeNotifierProvider(create: (_) => DeviceTransferProvider()),
ChangeNotifierProvider(create: (_) => EmployeesProvider()), ChangeNotifierProvider(create: (_) => AssignedToProvider()),
ChangeNotifierProvider(create: (_) => PentryTaskStatusProvider()), ChangeNotifierProvider(create: (_) => PentryTaskStatusProvider()),
ChangeNotifierProvider(create: (_) => PentryVisitStatusProvider()), ChangeNotifierProvider(create: (_) => PentryVisitStatusProvider()),
ChangeNotifierProvider(create: (_) => PentryStatusProvider()), ChangeNotifierProvider(create: (_) => PentryStatusProvider()),
ChangeNotifierProvider(create: (_) => ServiceRequestPriorityProvider()), ChangeNotifierProvider(create: (_) => ServiceRequestPriorityProvider()),
ChangeNotifierProvider(create: (_) => ServiceRequestDefectTypesProvider()), ChangeNotifierProvider(create: (_) => ServiceRequestDefectTypesProvider()),
ChangeNotifierProvider(create: (_) => ServiceRequestTypeProvider()),
ChangeNotifierProvider(create: (_) => ServiceRequestedThroughProvider()),
ChangeNotifierProvider(create: (_) => ServiceRequestStatusProvider()),
ChangeNotifierProvider(create: (_) => EngineersProvider()),
], ],
child: GestureDetector( child: GestureDetector(
onTap: () { onTap: () {

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

@ -1,43 +1,44 @@
import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/models/lookup.dart';
import 'model.dart';
class Device{ class Device{
String id; int id;
String serialNumber; String serialNumber;
String number; String number;
String brand; // String brand;
String model; // String model;
DateTime productionDate; ModelDefinition modelDefinition;
DateTime supplyDate; Hospital hospital;
DateTime installDate;
DateTime receivingDate;
DateTime operationDate;
DateTime warrantyDate;
Device({ Device({
this.id, this.id,
this.serialNumber, this.serialNumber,
this.number, this.number,
this.brand, this.hospital,
this.model, // this.brand,
this.productionDate, // this.model,
this.supplyDate, this.modelDefinition,
this.installDate,
this.receivingDate,
this.operationDate,
this.warrantyDate,
}); });
factory Device.fromJson(Map<String,dynamic> parsedJson){ factory Device.fromJson(Map<String,dynamic> parsedJson){
return Device( return Device(
id: parsedJson["nid"] ?? parsedJson["id"], id: parsedJson["id"],
serialNumber: parsedJson["sn"] ?? parsedJson["value"], serialNumber: parsedJson["assetSerialNo"],
number: parsedJson["asset_no"], number: parsedJson["assetNumber"],
brand: parsedJson["brand"].toString(), modelDefinition:ModelDefinition.fromJson(parsedJson["modelDefinition"]),
model: parsedJson["model"].toString(), hospital:Hospital.fromJson(parsedJson["site"]),
productionDate: getDateFromString(parsedJson["production_date"]), // parsedJson["modelDefinition"] == null ? "" :
supplyDate: getDateFromString(parsedJson["supply_date "]), // parsedJson["modelDefinition"]["manufacturerName"],
installDate: getDateFromString(parsedJson["install_date "]), // model: parsedJson["modelDefinition"] == null ? "" :
receivingDate: getDateFromString(parsedJson["receving_date "]), // parsedJson["modelDefinition"]["modelName"],
operationDate: getDateFromString(parsedJson["operation_date "]),
warrantyDate: getDateFromString(parsedJson["warranty_date "]),
); );
} }
@ -46,21 +47,19 @@ class Device{
id: device.id, id: device.id,
serialNumber: device.serialNumber, serialNumber: device.serialNumber,
number: device.number, number: device.number,
brand: device.brand, // brand: device.brand,
model: device.model, // model: device.model,
productionDate: device.productionDate,
supplyDate: device.supplyDate,
installDate: device.installDate,
receivingDate: device.receivingDate,
operationDate: device.operationDate,
warrantyDate: device.warrantyDate,
); );
} }
}
DateTime getDateFromString(String unixDate){ Map<String, dynamic> toMap(Lookup assetType) {
if(unixDate == null) return {
return null; 'id': id,
return DateTime.fromMillisecondsSinceEpoch( 'assetSerialNo': serialNumber,
int.parse(unixDate)); 'assetNumber': number,
'modelDefinition': modelDefinition.toJson(),
'site': hospital.toMap(),
'AssetType':assetType.toMap(),
};
}
} }

@ -1,8 +1,12 @@
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.dart';
import 'package:test_sa/models/device/device_transfer_info.dart'; import 'package:test_sa/models/device/device_transfer_info.dart';
import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/models/lookup.dart';
class DeviceTransfer{ class DeviceTransfer{
String id; int id;
String userId; String userId;
String title; String title;
Device device; Device device;
@ -39,11 +43,55 @@ class DeviceTransfer{
factory DeviceTransfer.fromJson(Map<String,dynamic> parsedJson){ factory DeviceTransfer.fromJson(Map<String,dynamic> parsedJson){
return DeviceTransfer( return DeviceTransfer(
id: parsedJson["id"], id: parsedJson["id"],
title: parsedJson["title"], title: parsedJson["transferCode"],
userId: parsedJson["uid"], userId: parsedJson["uid"],
device: Device.fromJson(parsedJson["eq_sn"]), device: Device(
sender: DeviceTransferInfo.fromJson(parsedJson,"sender_"), id: parsedJson["assetId"],
receiver: DeviceTransferInfo.fromJson(parsedJson,"receiver_"), 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"],
),
),
); );
} }
} }

@ -9,7 +9,7 @@ class DeviceTransferInfo{
Department department; Department department;
String workingHours; String workingHours;
String travelingHours; String travelingHours;
String name; String userName;
String signature; String signature;
Lookup status; Lookup status;
@ -18,7 +18,7 @@ class DeviceTransferInfo{
this.comment, this.comment,
this.department, this.department,
this.client, this.client,
this.name, this.userName,
this.travelingHours, this.travelingHours,
this.workingHours, this.workingHours,
this.signature, this.signature,
@ -45,7 +45,7 @@ class DeviceTransferInfo{
fromDetails(DeviceTransferInfo old,{bool withSignature = true}){ fromDetails(DeviceTransferInfo old,{bool withSignature = true}){
userId = old.userId; userId = old.userId;
name = old.name; userName = old.userName;
client = Hospital.fromHospital(old.client); client = Hospital.fromHospital(old.client);
department = Department.fromDepartment(old.department); department = Department.fromDepartment(old.department);
workingHours = old.workingHours; workingHours = old.workingHours;
@ -59,13 +59,22 @@ class DeviceTransferInfo{
return DeviceTransferInfo( return DeviceTransferInfo(
workingHours: parsedJson["${key}working_hours"], workingHours: parsedJson["${key}working_hours"],
travelingHours: parsedJson["${key}travel_hours"], travelingHours: parsedJson["${key}travel_hours"],
name: parsedJson["${key}name"], userName: parsedJson["${key}name"],
signature: parsedJson["${key}image"], signature: parsedJson["${key}image"],
userId: parsedJson["${key}id"], userId: parsedJson["${key}id"],
comment: parsedJson["${key}comment"], comment: parsedJson["${key}comment"],
client: Hospital.fromJson(parsedJson["${key}client"]), client: Hospital(
department: Department.fromJson(parsedJson["${key}department"]), id: parsedJson["${key}SiteId"],
status: Lookup.fromJson(parsedJson["${key}status"]), 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,47 @@
class ModelDefinition {
int id;
String assetName;
String modelDefCode;
String modelName;
String manufacturerName;
String supplierName;
String replacementDate;
int lifeSpan;
ModelDefinition(
{this.id,
this.assetName,
this.modelDefCode,
this.modelName,
this.manufacturerName,
this.supplierName,
this.replacementDate,
this.lifeSpan,});
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['assetName'] = assetName;
data['modelDefCode'] = modelDefCode;
data['modelName'] = modelName;
data['manufacturerName'] = manufacturerName;
data['supplierName'] = supplierName;
data['replacementDate'] = replacementDate;
data['lifeSpan'] = lifeSpan;
return data;
}
factory ModelDefinition.fromJson(Map<String, dynamic> map) {
if(map == null) return null;
return ModelDefinition(
id: map['id'] as int,
assetName: map['assetName'] as String,
modelDefCode: map['modelDefCode'] as String,
modelName: map['modelName'] as String,
manufacturerName: map['manufacturerName'] as String,
supplierName: map['supplierName'] as String,
replacementDate: map['replacementDate'] as String,
lifeSpan: map['lifeSpan'] as int,
);
}
}

@ -0,0 +1,41 @@
class Engineer{
String id;
String name;
Engineer({
this.id,
this.name,
});
factory Engineer.fromJson(Map<String,dynamic> parsedJson){
return Engineer(
id: parsedJson["userId"] ?? parsedJson["id"],
name: parsedJson["userName"] ?? parsedJson["name"],
);
}
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;
Map<String, dynamic> toMap() {
return {
'id': id,
'name': name,
};
}
}

@ -3,12 +3,14 @@ import 'package:test_sa/models/lookup.dart';
class GasRefillDetails{ class GasRefillDetails{
Lookup type; Lookup type;
Lookup cylinderSize; Lookup cylinderSize;
int requestedQuantity; Lookup cylinderType;
int deliveredQuantity; double requestedQuantity;
double deliveredQuantity;
GasRefillDetails({ GasRefillDetails({
this.type, this.type,
this.cylinderSize, this.cylinderSize,
this.cylinderType,
this.requestedQuantity, this.requestedQuantity,
this.deliveredQuantity, this.deliveredQuantity,
}); });
@ -21,13 +23,11 @@ class GasRefillDetails{
} }
factory GasRefillDetails.fromJson(Map<String,dynamic> parsedJson){ factory GasRefillDetails.fromJson(Map<String,dynamic> parsedJson){
return GasRefillDetails( return GasRefillDetails(
type: Lookup.fromJson(parsedJson["type"]), type: Lookup.fromJson(parsedJson["gasType"]),
cylinderSize: Lookup.fromJson(parsedJson["cylinderSize"]),
cylinderSize: Lookup.fromJson(parsedJson["size"]), cylinderType: Lookup.fromJson(parsedJson["cylinderType"]),
requestedQuantity: parsedJson["requsted_qty"] == null requestedQuantity: parsedJson["requestedQty"],
? 0 : int.tryParse(parsedJson["requsted_qty"].toString()) ?? 0, deliveredQuantity: parsedJson["deliverdQty"],
deliveredQuantity: parsedJson["deliverd_qty"] == null
? 0 : int.tryParse(parsedJson["deliverd_qty"].toString()) ?? 0,
); );
} }
@ -35,6 +35,7 @@ class GasRefillDetails{
return GasRefillDetails( return GasRefillDetails(
type: Lookup.fromStatus(details.type), type: Lookup.fromStatus(details.type),
cylinderSize:Lookup.fromStatus(details.cylinderSize), cylinderSize:Lookup.fromStatus(details.cylinderSize),
cylinderType:Lookup.fromStatus(details.cylinderType),
requestedQuantity: details.requestedQuantity, requestedQuantity: details.requestedQuantity,
deliveredQuantity: details.deliveredQuantity, 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'; import 'package:test_sa/models/lookup.dart';
class GasRefillModel{ class GasRefillModel{
String id; int id;
String userId; //String userId;
String clientName; String clientName;
String title; String title;
Lookup status; Lookup status;
@ -11,7 +11,7 @@ class GasRefillModel{
GasRefillModel({ GasRefillModel({
this.id, this.id,
this.userId, //this.userId,
this.clientName, this.clientName,
this.title, this.title,
this.status, this.status,
@ -27,7 +27,7 @@ class GasRefillModel{
fromGasRefillModel(GasRefillModel model){ fromGasRefillModel(GasRefillModel model){
id = model.id; id = model.id;
userId = model.userId; //userId = model.userId;
clientName = model.clientName; clientName = model.clientName;
title = model.title; title = model.title;
status = Lookup.fromStatus(model.status); status = Lookup.fromStatus(model.status);
@ -36,15 +36,16 @@ class GasRefillModel{
factory GasRefillModel.fromJson(Map<String,dynamic> parsedJson){ factory GasRefillModel.fromJson(Map<String,dynamic> parsedJson){
List<GasRefillDetails> details = []; List<GasRefillDetails> details = [];
if(parsedJson["details"] != null){ if(parsedJson["gazRefillDetails"] != null){
List list = parsedJson["details"]; List list = parsedJson["gazRefillDetails"];
details = list.map((e) => GasRefillDetails.fromJson(e)).toList(); details = list.map((e) => GasRefillDetails.fromJson(e)).toList();
} }
return GasRefillModel( return GasRefillModel(
id: parsedJson["id"], id: parsedJson["id"],
userId: parsedJson["uid"], //userId: parsedJson["uid"],
title: parsedJson["title"], title: parsedJson["gazRefillNo"],
clientName: parsedJson["client"], clientName: parsedJson["site"] == null ? null:
parsedJson["site"]["custName"],
status: Lookup.fromJson(parsedJson["status"]), status: Lookup.fromJson(parsedJson["status"]),
details: details, details: details,
); );

@ -1,16 +1,23 @@
class Hospital{ class Hospital{
String id; int id;
int customerCode;
String name; String name;
List buildings;
Hospital({ Hospital({
this.id, this.id,
this.customerCode,
this.name, this.name,
this.buildings,
}); });
factory Hospital.fromJson(Map<String,dynamic> parsedJson){ factory Hospital.fromJson(Map<String,dynamic> parsedJson){
return Hospital( return Hospital(
id: parsedJson["nid"] ?? parsedJson["id"], id: parsedJson["id"],
name: parsedJson["client_name"] ?? parsedJson["value"], name: parsedJson["custName"],
customerCode: parsedJson["customerCode"],
buildings: parsedJson["buildings"]
); );
} }
@ -18,6 +25,17 @@ class Hospital{
return Hospital( return Hospital(
id: hospital?.id, id: hospital?.id,
name: hospital?.name, name: hospital?.name,
customerCode: hospital?.customerCode,
buildings:hospital?.buildings
); );
} }
Map<String, dynamic> toMap() {
return {
'id': id,
'customerCode': customerCode,
'custName': name,
"buildings":buildings
};
}
} }

@ -1,47 +0,0 @@
class Lookup{
final String label;
final String key;
final int id;
const Lookup({
this.label,
this.key,
this.id,
});
@override
bool operator == (Object other) =>
identical(this, other) || other is Lookup &&
key == other.key &&
id == other.id;
@override
int get hashCode => id.hashCode;
factory Lookup.fromStatus(Lookup old){
return Lookup(
label: old.label,
id: old.id,
key: old.key,
);
}
factory Lookup.fromJson(Map<String,dynamic> parsedJson){
if(parsedJson["id"] == null && parsedJson["uid"] == null) return null;
return Lookup(
label: 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"],
id: parsedJson["id"],
);
}
}

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

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

@ -1,6 +1,8 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'dart:typed_data';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/pantry/calibration_tools.dart'; import 'package:test_sa/models/pantry/calibration_tools.dart';
import 'package:test_sa/models/pantry/pm_kit.dart'; import 'package:test_sa/models/pantry/pm_kit.dart';
@ -12,6 +14,7 @@ class Pentry{
Lookup status; Lookup status;
TimerModel timer; TimerModel timer;
DateTime actualVisitDate; DateTime actualVisitDate;
DateTime expectedVisitDate;
String travelingHours; String travelingHours;
String image; String image;
File imageFile; File imageFile;
@ -19,6 +22,10 @@ class Pentry{
List<PPMCheckList> ppmCheckLists; List<PPMCheckList> ppmCheckLists;
List<CalibrationTool> calibrationTools; List<CalibrationTool> calibrationTools;
List<PMKit> pmKits; List<PMKit> pmKits;
String signatureNurse;
String signatureEngineer;
Uint8List localNurseSignature;
Uint8List localEngineerSignature;
Pentry({ Pentry({
this.travelingHours, this.travelingHours,
@ -26,16 +33,22 @@ class Pentry{
this.status, this.status,
this.ppmVisitStatus, this.ppmVisitStatus,
this.actualVisitDate, this.actualVisitDate,
this.expectedVisitDate,
this.image, this.image,
this.imageFile, this.imageFile,
// this.contacts, // this.contacts,
this.ppmCheckLists, this.ppmCheckLists,
this.calibrationTools, this.calibrationTools,
this.pmKits, this.pmKits,
this.signatureNurse,
this.signatureEngineer,
this.localNurseSignature,
this.localEngineerSignature
}); });
bool validate(){ bool validate(){
if(actualVisitDate == null) return false; if(actualVisitDate == null) return false;
if(expectedVisitDate == null) return false;
if(timer == null && timer.endAt != null) return false; if(timer == null && timer.endAt != null) return false;
if(ppmVisitStatus == null) return false; if(ppmVisitStatus == null) return false;
//if(status == null) return false; //if(status == null) return false;
@ -43,18 +56,29 @@ class Pentry{
return true; return true;
} }
Map<String, String> toMap() {
Map<String, String> map = {};
map["visit_status"] = ppmVisitStatus?.id.toString(); Map<String, dynamic> toMap(int visitId) {
if(status != null) map["pentry_status"] = status?.id.toString(); Map<String, dynamic> map = {};
if(travelingHours != null) map["traveling_hours"] = travelingHours; map["visitStatusId"] = ppmVisitStatus?.id.toString();
if(imageFile != null) map["file_attachement"] = base64Encode(imageFile.readAsBytesSync()); //if(status != null) map["visitStatusId"] = status?.id.toString();
map["actual_date"] = (actualVisitDate.millisecondsSinceEpoch / 1000).toStringAsFixed(0); 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){ if(timer != null){
map["start_date"] = (timer.startAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0); map["startDate"] = timer.startAt.toIso8601String();
map["end_date"] = ((timer.endAt ?? DateTime.now()).millisecondsSinceEpoch / 1000).toStringAsFixed(0); map["endDate"] = timer.endAt?.toIso8601String() ?? DateTime.now().toIso8601String();
map["working_hours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5); 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) { // if(contacts?.isNotEmpty == true) {
// for(int i = 0;i<contacts.length;i++){ // for(int i = 0;i<contacts.length;i++){
// contacts[i].toMap().forEach((key, value) { // contacts[i].toMap().forEach((key, value) {
@ -62,9 +86,11 @@ class Pentry{
// }); // });
// } // }
// } // }
map["ppmCheckLists"] = jsonEncode(ppmCheckLists.map((e) => e.toMap()).toList()); map["vChecklists"] = ppmCheckLists.map((e) => e.toMap(visitId)).toList();
map["calibrationTools"] = jsonEncode(calibrationTools.map((e) => e.toMap()).toList()); map["vCalibrationTools"] = calibrationTools.map((e) => e.toMap(visitId)).toList();
map["pmKits"] = jsonEncode(pmKits.map((e) => e.toMap()).toList()); map["vKits"] = pmKits.map((e) => e.toMap(visitId)).toList();
map["nurseSignature"] = signatureNurse;
map["engSignature"] = signatureEngineer;
return map; return map;
} }
@ -77,44 +103,74 @@ class Pentry{
// } // }
List<PMKit> pmKits = []; List<PMKit> pmKits = [];
if(map['pmKits'] != null){ if(map['vKits'] != null){
pmKits =(map['pmKits'] as List<dynamic>) pmKits =(map['vKits'] as List<dynamic>)
.map((e) => PMKit.fromMap(e as Map<String, dynamic>)) .map((e) => PMKit.fromMap(e as Map<String, dynamic>))
.toList(); .toList();
} }
List<PPMCheckList> ppmCheckLists = []; List<PPMCheckList> ppmCheckLists = [];
if(map['ppmCheckLists'] != null){ if(map['vChecklists'] != null){
ppmCheckLists =(map['ppmCheckLists'] as List<dynamic>) ppmCheckLists =(map['vChecklists'] as List<dynamic>)
.map((e) => PPMCheckList.fromMap(e as Map<String, dynamic>)) .map((e) => PPMCheckList.fromMap(e as Map<String, dynamic>))
.toList(); .toList();
} }
List<CalibrationTool> calibrationTools = []; List<CalibrationTool> calibrationTools = [];
if(map['calibrationTools'] != null){ if(map['vCalibrationTools'] != null){
calibrationTools =(map['calibrationTools'] as List<dynamic>) calibrationTools =(map['vCalibrationTools'] as List<dynamic>)
.map((e) => CalibrationTool.fromMap(e as Map<String, dynamic>)) .map((e) => CalibrationTool.fromMap(e as Map<String, dynamic>))
.toList(); .toList();
} }
return Pentry( return Pentry(
status: Lookup.fromJson(map["pentry_status"]), status: Lookup(id: map["taskStatusId"],name: map["taskStatusName"]),
ppmVisitStatus: Lookup.fromJson(map["visit_status"]), ppmVisitStatus: Lookup(id: map["visitStatusId"],name: map["visitStatusName"]),
actualVisitDate: getDate(map["actual_date"]), actualVisitDate: DateTime.tryParse(map["actualDate"] ?? ""),
travelingHours: map["traveling_hours"], expectedVisitDate: DateTime.tryParse(map["expectedDate"] ?? ""),
travelingHours: map["travelingHours"],
timer: TimerModel( timer: TimerModel(
startAt: getDate(map["start_date"]), startAt: DateTime.tryParse(map["startDate"] ?? ""),
endAt: getDate(map["end_date"]), endAt: DateTime.tryParse(map["endDate"] ?? ""),
durationInSecond: (int.tryParse(map["working_hours"] ?? "") ?? 0) * 60 *60 durationInSecond: (int.tryParse(map["workingHours"] ?? "") ?? 0) * 60 *60
), ),
// contacts: contacts, // contacts: contacts,
ppmCheckLists: ppmCheckLists, ppmCheckLists: ppmCheckLists,
calibrationTools: calibrationTools, calibrationTools: calibrationTools,
pmKits: pmKits, pmKits: pmKits,
signatureNurse: URLs.getFileUrl(map["nurseSignature"]) ,
signatureEngineer:URLs.getFileUrl(map["engSignature"]),
); );
} }
static getDate(String date){ Pentry copyWith({
return date == null || date.isEmpty Lookup ppmVisitStatus,
? null : DateTime.fromMillisecondsSinceEpoch(int.tryParse(date) * 1000); Lookup status,
TimerModel timer,
DateTime actualVisitDate,
DateTime expectedVisitDate,
String travelingHours,
String image,
File imageFile,
List<PPMCheckList> ppmCheckLists,
List<CalibrationTool> calibrationTools,
List<PMKit> pmKits,
String signatureNurse,
String signatureEngineer,
}) {
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(),
signatureNurse: signatureNurse ?? this.signatureNurse,
signatureEngineer: signatureEngineer ?? this.signatureEngineer
);
} }
} }

@ -1,6 +1,7 @@
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
class PMKit{ class PMKit{
int id;
Lookup itemCode; Lookup itemCode;
String itemName; String itemName;
String preparationTimeFrame; String preparationTimeFrame;
@ -10,6 +11,7 @@ class PMKit{
String quantityReserved; String quantityReserved;
PMKit({ PMKit({
this.id,
this.itemCode, this.itemCode,
this.itemName, this.itemName,
this.preparationTimeFrame, this.preparationTimeFrame,
@ -19,21 +21,24 @@ class PMKit{
this.quantityReserved this.quantityReserved
}); });
Map<String, String> toMap() { Map<String, dynamic> toMap(int visitId) {
return { return {
if(itemCode != null) 'itemCode': (itemCode?.id).toString(), "id":id ?? 0,
if(itemName != null) 'itemName': itemName, "visitId": visitId,
if(preparationTimeFrame != null) 'preparationTimeFrame': preparationTimeFrame, if(itemCode != null) 'partCatalogItemId': (itemCode?.id).toString(),
if(kitFrequencyDemand != null) 'kitFrequencyDemand': kitFrequencyDemand, // if(itemName != null) 'itemName': itemName,
if(availability != null) 'availability': availability, // if(preparationTimeFrame != null) 'preparationTimeFrame': preparationTimeFrame,
if(quantityNeeded != null) 'quantityNeeded': quantityNeeded, // if(kitFrequencyDemand != null) 'kitFrequencyDemand': kitFrequencyDemand,
if(quantityReserved != null) 'quantityReserved': quantityReserved, // if(availability != null) 'availability': availability,
// if(quantityNeeded != null) 'quantityNeeded': quantityNeeded,
// if(quantityReserved != null) 'quantityReserved': quantityReserved,
}; };
} }
factory PMKit.fromMap(Map<String, dynamic> map) { factory PMKit.fromMap(Map<String, dynamic> map) {
return PMKit( return PMKit(
itemCode: Lookup.fromJson(map['itemCode']), id: map['id'],
itemCode: Lookup(id:map['partCatalogItemId'],name:map["partNumber"]),
itemName: map['itemName'] as String, itemName: map['itemName'] as String,
preparationTimeFrame: map['preparationTimeFrame'] as String, preparationTimeFrame: map['preparationTimeFrame'] as String,
kitFrequencyDemand: map['kitFrequencyDemand'] as String, kitFrequencyDemand: map['kitFrequencyDemand'] as String,
@ -42,4 +47,26 @@ class PMKit{
quantityReserved: map['quantityReserved'] as String, 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'; import 'package:test_sa/models/lookup.dart';
class PPMCheckList{ class PPMCheckList{
int id;
Lookup status; Lookup status;
String title; String title;
String comment; String comment;
String measuredValue; String measuredValue;
PPMCheckList({ PPMCheckList({
this.id,
this.title, this.title,
this.status, this.status,
this.comment, this.comment,
this.measuredValue, this.measuredValue,
}); });
Map<String, String> toMap() { Map<String, dynamic> toMap(int visitId) {
return { return {
if(status != null) 'status': status?.id.toString(), 'id': id ?? 0,
if(title != null) 'title': title, "visitId": visitId,
if(comment != null) 'comment': comment, if(status != null) 'taskStatusId': status?.id.toString(),
if(title != null) 'task': title,
if(comment != null) 'taskComment': comment,
if(measuredValue != null) 'measuredValue': measuredValue, if(measuredValue != null) 'measuredValue': measuredValue,
}; };
} }
factory PPMCheckList.fromMap(Map<String, dynamic> map) { factory PPMCheckList.fromMap(Map<String, dynamic> map) {
return PPMCheckList( return PPMCheckList(
status: Lookup.fromJson(map['status']), id: map['id'] as int,
title: map['title'] as String, status: Lookup(id: map["taskStatusId"],name: map["taskStatusName"]),
comment: map['comment'] as String, title: map['task'] as String,
comment: map['taskComment'] as String,
measuredValue: map['measuredValue'] 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,23 +1,37 @@
class Part{ class Part{
String id; int id;
int reportPartID;
String code; String code;
String name; String name;
int quantity; int quantity;
Part({ Part({
this.id, this.id,
this.reportPartID,
this.code, this.code,
this.name, this.name,
this.quantity = 1, this.quantity = 1,
}); });
factory Part.fromJson(Map<String,dynamic> parsedJson){ Map<String,dynamic> toJson(){
return {
"id": reportPartID ?? 0,
"sparePart":{
"id":id,
"partNo": code,
"partName":name
},
"qty":quantity
};
}
factory Part.fromJson(Map<String,dynamic> parsedJson,{Map<String,dynamic> reportJson}){
return Part( return Part(
id: parsedJson["nid"] ?? parsedJson["id"], id: parsedJson["id"],
code: parsedJson["part_code"] ?? parsedJson["name"], reportPartID: reportJson != null ? reportJson["id"] : null,
name: parsedJson["part_name"], code: parsedJson["partNo"],
quantity: parsedJson["qty"] == null name: parsedJson["partName"],
? 1 : int.tryParse(parsedJson["qty"].toString()) ?? 1, quantity: reportJson != null ? (reportJson["qty"] ?? 1).toInt() : 1,
); );
} }
} }

@ -1,21 +1,25 @@
import 'dart:convert'; import 'dart:typed_data';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/device/device.dart';
import 'package:test_sa/models/engineer.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/part.dart';
import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/timer_model.dart';
class ServiceReport { class ServiceReport {
String id; int id;
String operatingHours; String operatingHours;
DateTime visitDate; DateTime visitDate;
DateTime endDate; DateTime endDate;
Lookup serviceType; Lookup assetType;
Lookup callLastSituation; Lookup callLastSituation;
Engineer engineer;
Lookup status; Lookup status;
Lookup type; Lookup type;
Lookup reason; Lookup reason;
String faultDescription; int faultDescriptionId;
String workPreformed; String workPreformed;
//String workHours; //String workHours;
String travelingHours; String travelingHours;
@ -27,18 +31,23 @@ class ServiceReport {
String quantity; String quantity;
String jobSheetNumber; String jobSheetNumber;
TimerModel timer; TimerModel timer;
String signatureNurse;
String signatureEngineer;
Uint8List localNurseSignature;
Uint8List localEngineerSignature;
ServiceReport({ ServiceReport({
this.id, this.id,
this.visitDate, this.visitDate,
this.endDate, this.endDate,
this.serviceType, this.assetType,
this.status, this.status,
this.type, this.type,
this.faultDescription, this.faultDescriptionId,
//this.workHours, //this.workHours,
this.travelingHours, this.travelingHours,
this.parts, this.parts,
this.engineer,
this.workPreformed, this.workPreformed,
this.reason, this.reason,
this.operatingHours, this.operatingHours,
@ -50,100 +59,128 @@ class ServiceReport {
this.invoiceNumber, this.invoiceNumber,
this.quantity = "1", this.quantity = "1",
this.timer, this.timer,
this.signatureNurse,
this.signatureEngineer,
this.localNurseSignature,
this.localEngineerSignature
}); });
Map<String,String> toMap(){ Map<String,dynamic> toMap(ServiceRequest request){
Map<String,String> _map = {}; Map<String,dynamic> _map = {};
if(id != null) _map["id"] = id; if(id != null) _map["id"] = id;
if(visitDate != null) _map["visit_date"] = (visitDate.millisecondsSinceEpoch ~/ 1000).toString(); if(visitDate != null) _map["visitDate"] = visitDate.toIso8601String();
if(serviceType != null) _map["service_type"] = serviceType.id.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(type != null) _map["typeOfWO"] = type?.toMap();
if(faultDescription != null && faultDescription.isNotEmpty) _map["fault_description"] = faultDescription; if(assetType != null) _map["TypeOfWO"] = assetType?.toMap();
//if(faultDescriptionId != null && faultDescriptionId.isNotEmpty) _map["fault_description"] = faultDescriptionId;
//if(workHours != null && workHours.isNotEmpty) _map["working_hours"] = workHours; //if(workHours != null && workHours.isNotEmpty) _map["working_hours"] = workHours;
if(timer != null){ if(timer != null){
_map["start_time"] = (timer.startAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0); _map["startofWorkTime"] = timer.startAt.toIso8601String();
_map["end_time"] = ((timer.endAt ?? DateTime.now()).millisecondsSinceEpoch / 1000).toStringAsFixed(0); _map["endofWorkTime"] = (timer.endAt ?? DateTime.now()).toIso8601String();
_map["working_hours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5); _map["workingHours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5);
} }
if(travelingHours != null && travelingHours.isNotEmpty) _map["traveling_hours"] = travelingHours; if(travelingHours != null && travelingHours.isNotEmpty) _map["traveling_hours"] = travelingHours;
if(workPreformed != null && workPreformed.isNotEmpty) _map["work_performed"] = workPreformed; // if(workPreformed != null && workPreformed.isNotEmpty){
// _map["faultDescription"] = {
// //"id":faultDescriptionId ?? 0,
// "workPerformed":workPreformed
// };
// }
if(jobSheetNumber != null && jobSheetNumber.isNotEmpty) _map["job_sheet_no"] = jobSheetNumber; if(jobSheetNumber != null && jobSheetNumber.isNotEmpty) _map["job_sheet_no"] = jobSheetNumber;
if(parts != null && parts.isNotEmpty){ if(parts != null && parts.isNotEmpty){
Map<String,int> _partsMap = {}; _map["sparePartsWorkOrders"] = parts.map((e) => e.toJson()).toList();
parts.forEach((part) {
if(part.id.isNotEmpty)
_partsMap[part.id] = part.quantity;
});
_map["parts"] = json.encode(_partsMap);
} }
if(device?.id != null && device.id != null) _map["eq_id"] = device.id; if(device != null && device.id != null){
if(quantity != null && quantity.isNotEmpty) _map["qty"] = quantity; _map["callRequest"] = {
if(endDate != null) _map["end_date"] = (endDate.millisecondsSinceEpoch ~/ 1000).toString(); "id":request.id,
if(reason != null) _map["reasons"] = reason.id.toString(); "asset":device?.toMap(assetType),
if(operatingHours != null && operatingHours.isNotEmpty) _map["operation_hours"] = operatingHours; };
if(callLastSituation != null) _map["call_last_situtation"] = callLastSituation.id.toString(); _map["callRequest"]["asset"]["invoiceNumber"] = invoiceNumber;
if(image != null) _map["image"] = image; }
if(invoiceCode != null) _map["invoice_no"] = invoiceCode; _map["AssignedEmployee"] = engineer?.toMap();
if(invoiceNumber != null) _map["invoice_code"] = invoiceNumber; //if(quantity != null && quantity.isNotEmpty) _map["qty"] = quantity;
//if(endDate != null) _map["end_date"] = (endDate.millisecondsSinceEpoch ~/ 1000).toString();
if(reason != null) _map["reason"] = reason.toMap();
//if(operatingHours != null && operatingHours.isNotEmpty) _map["operation_hours"] = operatingHours;
if(callLastSituation != null) _map["calllastSituation"] = callLastSituation.toMap();
//if(image != null) _map["image"] = image;
//if(invoiceCode != null) _map["invoice_no"] = invoiceCode;
//if(invoiceNumber != null) _map["invoice_code"] = invoiceNumber;
if(image != null){
_map["attachmentsWorkOrder"]=[{
"name":image
}];
}
_map["nurseSignature"] = signatureNurse;
_map["engSignature"] = signatureEngineer;
return _map; return _map;
} }
bool validate(){ bool validate(){
if(visitDate == null) return false; if(visitDate == null) return false;
if(serviceType == null) return false; //if(serviceType == null) return false;
if(status == null) return false; if(status == null) return false;
if(type == null) return false; if(type == null) return false;
if(engineer == null) return false;
if(callLastSituation == null) return false; if(callLastSituation == null) return false;
if(callLastSituation?.id == 12){ if(callLastSituation?.value == 12){
if(invoiceCode != null || invoiceCode?.isEmpty == true) return false; // if(invoiceCode != null || invoiceCode?.isEmpty == true) return false;
if(invoiceNumber != null || invoiceNumber?.isEmpty== true ) return false; if(invoiceNumber != null || invoiceNumber?.isEmpty== true ) return false;
} }
if(parts == null) return false; if(parts == null) return false;
//if(endDate == null) return false; //if(endDate == null) return false;
//if(reason == 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(quantity == null || quantity.isEmpty) return false;
//if(image == null) return false; //if(image == null) return false;
return true; return true;
} }
factory ServiceReport.fromJson(Map<String,dynamic> parsedJson,String id){ factory ServiceReport.fromJson(Map<String,dynamic> parsedJson,int id){
List<Part> _parts = []; List<Part> _parts = [];
if(parsedJson["parts"] != null){ if(parsedJson["sparePartsWorkOrders"] != null){
if(parsedJson["parts"][0]["id"] != null){ if(parsedJson["sparePartsWorkOrders"][0]["id"] != null){
List partsList = parsedJson["parts"]; List partsList = parsedJson["sparePartsWorkOrders"];
_parts = partsList.map((e) => Part.fromJson(e)).toList(); _parts = partsList.map((e) => Part.fromJson(
e["sparePart"],reportJson: e)).toList();
} }
} }
return ServiceReport( return ServiceReport(
id: id, id: id,
serviceType: Lookup.fromJson(parsedJson["service_type"]), assetType: Lookup.fromJson(parsedJson["assetType"]),
callLastSituation: Lookup.fromJson(parsedJson["call_last_situtation"]), callLastSituation: Lookup.fromJson(parsedJson["calllastSituation"]),
reason: Lookup.fromJson(parsedJson["reasons"]), reason: Lookup.fromJson(parsedJson["reason"]),
status: Lookup.fromJson(parsedJson["service_report_status"]), status: Lookup.fromJson(parsedJson["status"]),
type: Lookup.fromJson(parsedJson["service_report_type"]), type: Lookup.fromJson(parsedJson["typeOfWO"]),
faultDescription: parsedJson["fault_description"], //faultDescriptionId: parsedJson["fault_description"],
endDate:getDate(parsedJson["end_date"]), endDate:DateTime.tryParse(parsedJson["endofWorkTime"]),
invoiceCode: parsedJson["invoice_code"], //invoiceCode: parsedJson["invoice_code"],
invoiceNumber: parsedJson["invoice_no"], //invoiceNumber: parsedJson["invoice_no"],
jobSheetNumber: parsedJson["job_sheet_no"], //jobSheetNumber: parsedJson["job_sheet_no"],
operatingHours: parsedJson["operation_hours"], //operatingHours: parsedJson["workingHours"],
engineer: Engineer.fromJson(parsedJson["assignedEmployee"]),
parts: _parts, parts: _parts,
quantity: parsedJson["nid"], //quantity: parsedJson["nid"],
travelingHours: parsedJson["traveling_hours"], //travelingHours: parsedJson["traveling_hours"],
visitDate: getDate(parsedJson["visit_date"]), visitDate: DateTime.tryParse(parsedJson["visitDate"]),
//workHours: parsedJson["working_hours"], //workHours: parsedJson["working_hours"],
timer: TimerModel( timer: TimerModel(
durationInSecond: (int.tryParse(parsedJson["working_hours"] ?? "") ?? 0) * 60 *60), startAt: DateTime.tryParse(parsedJson["startofWorkTime"]),
workPreformed: parsedJson["work_performed"], endAt: DateTime.tryParse(parsedJson["endofWorkTime"]),
device: parsedJson["eq_nid"] == null ? null : Device(id: parsedJson["eq_nid"],serialNumber: parsedJson["eq_serial"]) durationInSecond: ((parsedJson["workingHours"] ?? 0) * 60 *60).toInt()
),
//workPreformed: parsedJson["work_performed"],
device: Device.fromJson(parsedJson["callRequest"]["asset"]),
signatureNurse: URLs.getFileUrl(parsedJson["nurseSignature"]) ,
signatureEngineer:URLs.getFileUrl(parsedJson["engSignature"]),
); );
} }
static getDate(String date){ // static getDate(String date){
return date == null || date.isEmpty // return date == null || date.isEmpty
? null : DateTime.fromMillisecondsSinceEpoch(int.tryParse(date) * 1000); // ? null : DateTime.fromMillisecondsSinceEpoch(int.tryParse(date) * 1000);
} // }
} }

@ -1,16 +1,18 @@
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/lookup.dart';
class ServiceRequest{ class ServiceRequest{
String id; String id;
String requestCode; String requestCode;
String deviceSerialNumber; String deviceSerialNumber;
String deviceId; int deviceId;
String deviceArName; String deviceArName;
String deviceEnName; String deviceEnName;
List<String> devicePhotos; List<String> devicePhotos;
String maintenanceIssue; String maintenanceIssue;
String hospitalName; String hospitalName;
String hospitalId; int hospitalId;
String departmentName; String departmentName;
String engineerName; String engineerName;
String date; String date;
@ -26,10 +28,13 @@ class ServiceRequest{
String visitDate; String visitDate;
DateTime nextVisitDate; DateTime nextVisitDate;
String jobSheetNumber; String jobSheetNumber;
String reportID; int reportID;
String deviceNumber; String deviceNumber;
Lookup priority; Lookup priority;
Lookup defectType; Lookup defectType;
Lookup type;
Lookup requestedThrough;
Device device;
ServiceRequest({ ServiceRequest({
this.id, this.id,
@ -61,42 +66,54 @@ class ServiceRequest{
this.defectType, this.defectType,
this.priority, this.priority,
this.deviceNumber, this.deviceNumber,
this.type,
this.requestedThrough,
this.device,
}); });
factory ServiceRequest.fromJson(Map<String,dynamic> parsedJson){ 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( return ServiceRequest(
id: parsedJson["nid"], id: parsedJson["id"].toString(),
requestCode: parsedJson["call_id"] ?? parsedJson["jobcode"] , requestCode: parsedJson["callNo"].toString(),
hospitalName: parsedJson["call_client"], hospitalName: parsedJson["asset"]["site"]["custName"],
deviceNumber: parsedJson["device_no"], deviceNumber: parsedJson["asset"]["assetNumber"].toString(),
deviceId: parsedJson["deviceid"], deviceId: parsedJson["asset"]["id"],
audio: parsedJson["audio"] ?? "", audio: URLs.getFileUrl(parsedJson["voiceNote"] ?? ""),
deviceArName: parsedJson["equipment_arabic_name"] == false deviceArName: parsedJson["asset"]["modelDefinition"]["assetName"] ?? "",
? "No Name found" : parsedJson["equipment_arabic_name"], deviceEnName: parsedJson["asset"]["modelDefinition"]["assetName"] ?? "",
deviceEnName: parsedJson["equipment_english_name"] == false devicePhotos: images,
? "No Name found" : parsedJson["equipment_english_name"], deviceSerialNumber: parsedJson["asset"]["assetSerialNo"],
devicePhotos: List<String>.from(parsedJson["image"]), date: DateTime.tryParse(parsedJson["requestedDate"] ?? "").toString().split(" ").first,
deviceSerialNumber: parsedJson["call_sn"], maintenanceIssue: parsedJson["comments"],
date: parsedJson["call_data"], statusLabel: parsedJson["status"] == null ? null :
maintenanceIssue: parsedJson["call_complaint"] ?? parsedJson["complaint"], parsedJson["status"]["name"],
statusLabel: parsedJson["status_value"], statusValue: parsedJson["status"] == null ? null :
statusValue: int.tryParse(parsedJson["status"]??"-1"), parsedJson["status"]["value"],
departmentName: parsedJson["department_name"], departmentName: parsedJson["asset"]["department"] != null ?
engineerName: parsedJson["employee_name"], parsedJson["asset"]["department"]["name"] : "",
hospitalId: parsedJson["client"], engineerName: parsedJson["assignedEmployee"] == null ? null :
reportID: parsedJson["service_report_nid"] is String parsedJson["assignedEmployee"]["name"],
? parsedJson["service_report_nid"] hospitalId: parsedJson["asset"]["site"]["id"],
: null , reportID: parsedJson["workOrder"] != null ?
viewReport: parsedJson["service_report_nid"] is bool ? false : true, parsedJson["workOrder"]["workOrderId"] : null,
deviceModel: parsedJson["device_model"], viewReport: parsedJson["workOrder"] != null,
engineerMobile: parsedJson["engineer_mobile"], deviceModel: parsedJson["asset"]["modelDefinition"]["modelName"],
faultDescription: parsedJson["fault_desc"], engineerMobile: parsedJson["assignedEmployee"] == null ? null :
jobSheetNumber: parsedJson["job_sheet_number"], parsedJson["assignedEmployee"]["phone"],
visitDate: parsedJson["visit_date"], faultDescription: parsedJson["workOrder"] != null ?
nextVisitDate:parsedJson["next_visit_date"] == null parsedJson["workOrder"]["faultDescription"] : null,
? null : DateTime.fromMillisecondsSinceEpoch(int.tryParse(parsedJson["next_visit_date"]) * 1000), jobSheetNumber: parsedJson["workOrder"] != null ?
workPerformed: parsedJson["work_performed"], parsedJson["workOrder"]["jobSheetNumber"] :null,
visitDate: DateTime.tryParse(parsedJson["visitDate"] ?? "").toString().split(" ").first,
nextVisitDate: DateTime.tryParse(parsedJson["nextVisitDate"] ?? ""),
workPerformed: parsedJson["workOrder"] != null ?
parsedJson["workOrder"]["workPerformed"] : null,
device: Device.fromJson(parsedJson["asset"])
); );
} }
} }

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

@ -3,12 +3,11 @@ import 'package:test_sa/models/department.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/hospital.dart';
class User { class User{
String id; String id;
String userName; String userName;
String password; String password;
String email; String email;
String image;
Hospital hospital; Hospital hospital;
Department department; Department department;
UsersTypes type; UsersTypes type;
@ -16,96 +15,108 @@ class User {
String whatsApp; String whatsApp;
String token; String token;
bool isActive; bool isActive;
DateTime tokenLife;
User(
{this.id, User({
this.userName = "", this.id,
this.email = "", this.userName = "",
this.password = "", this.email = "",
this.phoneNumber = "", this.password = "",
this.hospital, this.phoneNumber = "",
this.image, this.hospital,
this.department, this.department,
this.type, this.type,
this.whatsApp, this.whatsApp,
this.token, this.token,
this.isActive = false}); this.tokenLife,
this.isActive = false
});
Future<Map<String, dynamic>> toLoginJson() async { Future<Map<String, dynamic>> toLoginJson() async {
if (FirebaseNotificationManger.token == null) await FirebaseNotificationManger.getToken(); if(FirebaseNotificationManger.token == null)
await FirebaseNotificationManger.getToken();
return { return {
"username": userName, "username":userName,
"pass": password, "password":password,
"firebase_token": FirebaseNotificationManger?.token ?? "", "firebase_token": FirebaseNotificationManger?.token ?? "",
}; };
} }
Map<String, dynamic> toUpdateProfileJson() { Map<String,dynamic> toUpdateProfileJson(){
Map<String, dynamic> jsonObject = {}; Map<String,dynamic> jsonObject ={};
if (department?.id != null && department.id.isNotEmpty) jsonObject["department"] = department.id; if(department?.id != null)
if (whatsApp != null && whatsApp.isNotEmpty) jsonObject["whatsapp"] = whatsApp; jsonObject["department"] = department.id;
if (phoneNumber != null && phoneNumber.isNotEmpty) jsonObject["phone"] = phoneNumber; if(whatsApp != null && whatsApp.isNotEmpty)
jsonObject["whatsapp"] = whatsApp;
if(phoneNumber != null && phoneNumber.isNotEmpty)
jsonObject["phone"] = phoneNumber;
return jsonObject; return jsonObject;
} }
Future<Map<String, dynamic>> toRegisterJson() async { Future<Map<String, dynamic>> toRegisterJson() async {
if (FirebaseNotificationManger.token == null) await FirebaseNotificationManger.getToken(); if(FirebaseNotificationManger.token == null)
await FirebaseNotificationManger.getToken();
return { return {
"username": userName, "username": userName,
"email": email, "email":email,
"whatsapp": whatsApp, "whatsapp":whatsApp,
"client": hospital.id, "client":hospital.id,
"department": department?.id, "department":department?.id,
"phone": phoneNumber, "phone":phoneNumber,
"pass": password, "pass":password,
"firebase_token": FirebaseNotificationManger?.token ?? "", "firebase_token": FirebaseNotificationManger?.token ?? "",
}; };
} }
Map<String, dynamic> toJson() { Map<String,dynamic> toJson(){
return { return {
"uid": id, "userID":id,
"name": userName, "username": userName,
"email": email, "email":email,
"token": token, "token":token,
"phone": phoneNumber, "phoneNumber":phoneNumber,
"whatsapp": whatsApp, "whatsapp":whatsApp,
"client": hospital?.id, "client_id":hospital?.id,
"client_name": hospital?.name, "client_name":hospital?.name,
"department": department?.id, "department_id":department?.id,
"department_name": department?.name, "department_name":department?.name,
"password": password, //"password":password,
"picture": image, "tokenlife":tokenLife.toIso8601String(),
"active": isActive ? 1 : 0, "active":isActive,
"role": type == UsersTypes.engineer ? "field_engineer" : "normal_user", "userRoles": type == UsersTypes.engineer
// "token":token, pass is token ? "value: R-6" : "value: R-5" ,
// "token":token, pass is token
}; };
} }
factory User.fromJson(Map<String, dynamic> parsedJson) { factory User.fromJson(Map<String,dynamic> parsedJson){
UsersTypes type; UsersTypes type;
switch (parsedJson["role"]) { if(parsedJson["userRoles"].toString().contains("value: R-4")
case "field_engineer": || parsedJson["userRoles"].toString().contains("value: R-5")
type = UsersTypes.engineer; || parsedJson["userRoles"].toString().contains("value: R-7")){
break; type = UsersTypes.normal_user;
default: } else {
type = UsersTypes.normal_user; type = UsersTypes.engineer;
break;
} }
return User( return User(
id: parsedJson["uid"], id: parsedJson["userID"],
userName: parsedJson["name"] ?? parsedJson["title"], userName: parsedJson["username"],
email: parsedJson["mail"] ?? parsedJson["email"], email: parsedJson["email"],
hospital: Hospital(id: parsedJson["client"], name: parsedJson["client_name"]), hospital: Hospital(
department: Department( id: parsedJson["client_id"],
id: parsedJson["department"], name: parsedJson["client_name"]
name: parsedJson["department_name"], ),
), department: Department(
image: parsedJson["picture"], id: parsedJson["department_id"],
phoneNumber: parsedJson["phone"], name: parsedJson["department_name"],
whatsApp: parsedJson["whatsapp"], ),
token: parsedJson["token"], phoneNumber: parsedJson["phoneNumber"],
isActive: parsedJson["active"] == "1", whatsApp: parsedJson["phoneNumber"],
type: type); token: parsedJson["token"],
isActive: parsedJson["isAuthenticated"],
tokenLife: DateTime.tryParse(parsedJson["tokenlife"]??""),
type:type
);
} }
} }

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

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

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

@ -1,5 +1,4 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/models/lookup.dart';
class AColors { class AColors {
AColors._(); AColors._();
static const Color white = Color(0xffffffff); static const Color white = Color(0xffffffff);

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

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

@ -4,7 +4,6 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart';
import 'package:test_sa/controllers/providers/api/device_transfer_provider.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/api/user_provider.dart';
import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
@ -69,22 +68,12 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
_validate = false; _validate = false;
Navigator.of(context).pop(); Navigator.of(context).pop();
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 @override
void setState(VoidCallback fn){ void setState(VoidCallback fn){
if(mounted) super.setState(() {}); if(!mounted) super.setState(() {});
} }
@override @override
@ -207,7 +196,9 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
newSignature: _signature, newSignature: _signature,
onSaved: (signature){ onSaved: (signature){
_signature = signature; _signature = signature;
if(signature == null || signature.isEmpty) return;
_formModel.signature = base64Encode(signature); _formModel.signature = base64Encode(signature);
}, },
), ),
Padding( Padding(

@ -1,7 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.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/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/user_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/providers/settings/setting_provider.dart';
@ -9,7 +8,6 @@ import 'package:test_sa/controllers/validator/validator.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/pages/register.dart';
import 'package:test_sa/views/pages/user/land_page.dart'; import 'package:test_sa/views/pages/user/land_page.dart';
import 'package:test_sa/views/widgets/app_text_form_field.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/buttons/app_button.dart';
@ -119,11 +117,13 @@ class _LoginState extends State<Login> {
); );
if (status >= 200 && status < 300) { if (status >= 200 && status < 300) {
_settingProvider.setUser(_userProvider.user); _settingProvider.setUser(_userProvider.user);
if (_userProvider.user.isActive) // if (_userProvider.user.isActive)
Navigator.of(context).pushNamed(LandPage.id); Navigator.of(context).pushNamed(LandPage.id);
else // else
Fluttertoast.showToast(msg: _subtitle.activationAlert); // Fluttertoast.showToast(msg: _subtitle.activationAlert);
} else { } else {
if(status >= 400 && status < 500) return;
String errorMessage = status == 400 ? _subtitle.wrongEmailOrPassword : HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); String errorMessage = status == 400 ? _subtitle.wrongEmailOrPassword : HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle);
ScaffoldMessenger.of(context).showSnackBar(SnackBar( ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(errorMessage), content: Text(errorMessage),

@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.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/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/user_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/providers/settings/setting_provider.dart';

@ -1,7 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flare_flutter/flare_actor.dart'; import 'package:flare_flutter/flare_actor.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -28,9 +27,11 @@ class _SplashScreenState extends State<SplashScreen> {
UserProvider _userProvider; UserProvider _userProvider;
_goToUserScreen(User user){ _goToUserScreen(User user){
_userProvider.user = user; if(user.tokenLife != null && user.tokenLife.isAfter(DateTime.now())){
// Navigator.of(context).pushNamed(Login.id); _userProvider.user = user;
Navigator.of(context).pushNamed(LandPage.id); // Navigator.of(context).pushNamed(Login.id);
Navigator.of(context).pushNamed(LandPage.id);
}
} }
@override @override
@ -67,7 +68,6 @@ class _SplashScreenState extends State<SplashScreen> {
fit: BoxFit.contain, fit: BoxFit.contain,
animation: "splash", animation: "splash",
callback: (animation) async { callback: (animation) async {
print(await FirebaseMessaging.instance.getToken());
Navigator.of(context).pushNamed(Login.id); Navigator.of(context).pushNamed(Login.id);
if(_settingProvider.isLoaded && _settingProvider.user != null){ if(_settingProvider.isLoaded && _settingProvider.user != null){
_goToUserScreen(_settingProvider.user); _goToUserScreen(_settingProvider.user);

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

@ -1,13 +1,14 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.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/gas_refill_provider.dart';
import 'package:test_sa/controllers/providers/api/user_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/providers/settings/setting_provider.dart';
import 'package:test_sa/controllers/validator/validator.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_details.dart';
import 'package:test_sa/models/gas_refill/gas_refill_model.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/models/subtitle.dart';
import 'package:test_sa/views/app_style/sizing.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/app_text_form_field.dart';
@ -15,6 +16,7 @@ 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/gas_refill/gas_refill_create_details_item.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.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_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_status.dart';
import 'package:test_sa/views/widgets/status/gas_refill/gas_type.dart'; import 'package:test_sa/views/widgets/status/gas_refill/gas_type.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
@ -155,19 +157,21 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
// _formModel.title = value; // _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,), // 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 SizedBox(height: 4,),
const ASubTitle("Type"), const ASubTitle("Type"),
if(_validate && _currentDetails.type == null) if(_validate && _currentDetails.type == null)
@ -180,17 +184,28 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
}, },
), ),
// const SizedBox(height: 8,), const SizedBox(height: 8,),
// const ASubTitle("Cylinder Size"), const ASubTitle("Cylinder Size"),
// if(_validate && _currentDetails.cylinderSize == null) if(_validate && _currentDetails.cylinderSize == null)
// ASubTitle(_subtitle.requiredWord,color: Colors.red,), ASubTitle(_subtitle.requiredWord,color: Colors.red,),
// const SizedBox(height: 4,), const SizedBox(height: 4,),
// GasCylinderSizeMenu( GasCylinderSizeMenu(
// initialValue: _currentDetails.cylinderSize, initialValue: _currentDetails.cylinderSize,
// onSelect: (status){ onSelect: (status){
// _currentDetails.cylinderSize = 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,), const SizedBox(height: 8,),
ASubTitle(_subtitle.quantity), ASubTitle(_subtitle.quantity),
if(_validate && _currentDetails.requestedQuantity == null) if(_validate && _currentDetails.requestedQuantity == null)
@ -206,7 +221,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
? null : "allow numbers only", ? null : "allow numbers only",
textInputType: TextInputType.number, textInputType: TextInputType.number,
onSaved: (value){ onSaved: (value){
_currentDetails.requestedQuantity = int.tryParse(value); _currentDetails.requestedQuantity = double.tryParse(value);
}, },
), ),
const SizedBox(height: 16), const SizedBox(height: 16),

@ -26,7 +26,6 @@ import 'package:test_sa/views/pages/device_transfer/request_device_transfer.dart
import 'package:test_sa/views/pages/device_transfer/track_device_transfer.dart'; import 'package:test_sa/views/pages/device_transfer/track_device_transfer.dart';
import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart'; import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart';
import 'package:test_sa/views/pages/user/gas_refill/track_gas_refill.dart'; import 'package:test_sa/views/pages/user/gas_refill/track_gas_refill.dart';
import 'package:test_sa/views/pages/user/notifications/notifications_page.dart';
import 'package:test_sa/views/pages/user/requests/create_request.dart'; import 'package:test_sa/views/pages/user/requests/create_request.dart';
import 'package:test_sa/views/pages/user/visits/regular_visits_page.dart'; import 'package:test_sa/views/pages/user/visits/regular_visits_page.dart';
import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart';
@ -235,6 +234,7 @@ class _LandPageState extends State<LandPage> {
_regularVisitsProvider.reset(); _regularVisitsProvider.reset();
_preventiveMaintenanceVisitsProvider.reset(); _preventiveMaintenanceVisitsProvider.reset();
_settingProvider.resetSettings(); _settingProvider.resetSettings();
_userProvider.reset();
Navigator.of(context).pop(); Navigator.of(context).pop();
} }
}, },

@ -1,3 +1,4 @@
import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/models/app_notification.dart'; import 'package:test_sa/models/app_notification.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
@ -5,7 +6,6 @@ import 'package:test_sa/views/pages/user/requests/future_request_service_details
import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; import 'package:test_sa/views/widgets/loaders/lazy_loading.dart';
import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart';
import 'package:test_sa/views/widgets/notifications/notification_item.dart'; import 'package:test_sa/views/widgets/notifications/notification_item.dart';
import 'package:flutter/material.dart';
class NotificationsList extends StatelessWidget { class NotificationsList extends StatelessWidget {
final List<AppNotification> notifications; final List<AppNotification> notifications;
final bool nextPage; final bool nextPage;

@ -1,4 +1,7 @@
import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/api_routes/http_status_manger.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/user_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/providers/settings/setting_provider.dart';
@ -13,9 +16,6 @@ import 'package:test_sa/views/widgets/buttons/app_button.dart';
import 'package:test_sa/views/widgets/departments/department_button.dart'; import 'package:test_sa/views/widgets/departments/department_button.dart';
import 'package:test_sa/views/widgets/hospitals/hospital_button.dart'; import 'package:test_sa/views/widgets/hospitals/hospital_button.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart';
class ProfilePage extends StatefulWidget { class ProfilePage extends StatefulWidget {
static final String id = "/user/profile"; static final String id = "/user/profile";
@override @override

@ -5,7 +5,7 @@ import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.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/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
@ -14,6 +14,7 @@ import 'package:test_sa/controllers/validator/validator.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/device/device.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/service_request/service_request.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/colors.dart';
@ -27,8 +28,9 @@ 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/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_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_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'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
class CreateRequestPage extends StatefulWidget { class CreateRequestPage extends StatefulWidget {
static final String id = "/create-request"; static final String id = "/create-request";
@ -153,6 +155,25 @@ class _CreateRequestPageState extends State<CreateRequestPage> {
}, },
), ),
12.height, 12.height,
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;
},
),
12.height,
MultiImagesPicker( MultiImagesPicker(
label: _subtitle.deviceImages, label: _subtitle.deviceImages,
images: _deviceImages, images: _deviceImages,
@ -189,10 +210,11 @@ class _CreateRequestPageState extends State<CreateRequestPage> {
_serviceRequest.deviceId = _device?.id ?? ""; _serviceRequest.deviceId = _device?.id ?? "";
_isLoading = true; _isLoading = true;
setState(() {}); setState(() {});
_serviceRequest.devicePhotos = _deviceImages.map((e) => base64Encode(e.readAsBytesSync())).toList(); _serviceRequest.devicePhotos = _deviceImages.map(
if (_serviceRequest.audio != null) { (e) => "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}").toList();
if(_serviceRequest.audio != null){
final file = File(_serviceRequest.audio); final file = File(_serviceRequest.audio);
_serviceRequest.audio = base64Encode(file.readAsBytesSync()); _serviceRequest.audio = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}";
} }
int status = await _serviceRequestsProvider.createRequest( int status = await _serviceRequestsProvider.createRequest(
user: _userProvider.user, user: _userProvider.user,

@ -1,3 +1,5 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/localization/localization.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/service_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
@ -7,8 +9,6 @@ import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/pages/user/requests/request_details.dart'; import 'package:test_sa/views/pages/user/requests/request_details.dart';
import 'package:test_sa/views/widgets/loaders/app_loading.dart'; import 'package:test_sa/views/widgets/loaders/app_loading.dart';
import 'package:test_sa/views/widgets/loaders/failed_loading.dart'; import 'package:test_sa/views/widgets/loaders/failed_loading.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class FutureRequestServiceDetails extends StatefulWidget { class FutureRequestServiceDetails extends StatefulWidget {
static final String id = "/service-request-details"; static final String id = "/service-request-details";

@ -1,14 +1,17 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; 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/api_routes/http_status_manger.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart';
import 'package:test_sa/controllers/providers/api/service_requests_provider.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';
import 'package:test_sa/controllers/providers/api/user_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/providers/settings/setting_provider.dart';
import 'package:test_sa/controllers/validator/validator.dart'; import 'package:test_sa/controllers/validator/validator.dart';
import 'package:test_sa/models/device/device.dart';
import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/part.dart';
import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_report.dart';
import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/service_request/service_request.dart';
@ -20,12 +23,13 @@ import 'package:test_sa/views/widgets/app_text_form_field.dart';
import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart';
import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.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/equipment/auto_complete_devices_field.dart'; import 'package:test_sa/views/widgets/equipment/auto_complete_devices_field.dart';
import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart'; import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart';
import 'package:test_sa/views/widgets/parts/part_item.dart'; import 'package:test_sa/views/widgets/parts/part_item.dart';
import 'package:test_sa/views/widgets/speech_to_text/speech_to_text.dart'; import 'package:test_sa/views/widgets/status/employee/engineers_mune.dart';
import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart'; import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart';
import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart'; import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart';
import 'package:test_sa/views/widgets/status/report/service_report_status.dart'; import 'package:test_sa/views/widgets/status/report/service_report_status.dart';
@ -33,10 +37,6 @@ import 'package:test_sa/views/widgets/status/report/service_report_type.dart';
import 'package:test_sa/views/widgets/status/report/service_status.dart'; import 'package:test_sa/views/widgets/status/report/service_status.dart';
import 'package:test_sa/views/widgets/timer/app_timer.dart'; import 'package:test_sa/views/widgets/timer/app_timer.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart';
class CreateServiceReport extends StatefulWidget { class CreateServiceReport extends StatefulWidget {
static final String id = "/create-service-report"; static final String id = "/create-service-report";
final ServiceRequest request ; final ServiceRequest request ;
@ -68,11 +68,8 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
void initState() { void initState() {
_serviceReport = ServiceReport( _serviceReport = ServiceReport(
visitDate: DateTime.now(), visitDate: DateTime.now(),
type: const Lookup(id: 2), //type: const Lookup(value: 2),
device: Device( device: widget.request.device,
id: widget.request.deviceId,
serialNumber: widget.request.deviceSerialNumber,
),
parts: [] parts: []
); );
super.initState(); super.initState();
@ -232,14 +229,14 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
), ),
const SizedBox(height: 8,), const SizedBox(height: 8,),
ASubTitle(_subtitle.serviceType), ASubTitle(_subtitle.serviceType),
_validate && _serviceReport.serviceType == null ? _validate && _serviceReport.assetType == null ?
ASubTitle(_subtitle.requiredWord,color: Colors.red,): ASubTitle(_subtitle.requiredWord,color: Colors.red,):
const SizedBox.shrink(), const SizedBox.shrink(),
const SizedBox(height: 4,), const SizedBox(height: 4,),
ServiceStatusMenu( ServiceAssetTypeMenu(
initialValue: _serviceReport.serviceType, initialValue: _serviceReport.assetType,
onSelect: (status){ onSelect: (status){
_serviceReport.serviceType = status; _serviceReport.assetType = status;
}, },
), ),
const SizedBox(height: 8,), const SizedBox(height: 8,),
@ -266,36 +263,53 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
), ),
), ),
const SizedBox(width: 8,), const SizedBox(width: 8,),
Provider.of<ServiceReportLastCallsProvider>(context).isLoading == null // Provider.of<ServiceReportLastCallsProvider>(context).isLoading == null
? const SizedBox.shrink(): // ? const SizedBox.shrink():
// Call's last Situation // Call's last Situation
Expanded( Consumer<ServiceReportLastCallsProvider>(
child: Column( builder: (_, provider, __) {
crossAxisAlignment: CrossAxisAlignment.start, if(provider.isLoading == null) return const SizedBox.shrink();
children: [ return Expanded(
child: Column(
ASubTitle(_subtitle.callLastSituation), crossAxisAlignment: CrossAxisAlignment.start,
_validate && _serviceReport.callLastSituation == null ? children: [
ASubTitle(_subtitle.requiredWord,color: Colors.red,): ASubTitle(_subtitle.callLastSituation),
const SizedBox.shrink(), _validate && _serviceReport.callLastSituation == null ?
const SizedBox(height: 4,), ASubTitle(_subtitle.requiredWord,color: Colors.red,):
ServiceReportLastCallsMenu( const SizedBox.shrink(),
report: _serviceReport, const SizedBox(height: 4,),
onSelect: (status){ ServiceReportLastCallsMenu(
if(status?.id == 12 report: _serviceReport,
|| _serviceReport.callLastSituation?.id == 12){ onSelect: (status){
_serviceReport.callLastSituation = status; if(status?.value == 12
setState(() {}); || _serviceReport.callLastSituation?.value == 12){
} else { _serviceReport.callLastSituation = status;
_serviceReport.callLastSituation = status; setState(() {});
} } else {
}, _serviceReport.callLastSituation = status;
}
},
),
],
), ),
], );
), },
), ),
], ],
), ),
SizedBox(height: 8 * AppStyle.getScaleFactor(context),),
const ASubTitle("Assign Employee"),
const SizedBox(height: 8,),
_validate && _serviceReport.engineer == null ?
ASubTitle(_subtitle.requiredWord,color: Colors.red,):
const SizedBox.shrink(),
const SizedBox(height: 4,),
EngineersMenu(
initialValue: _serviceReport.engineer,
onSelect: (engineer){
_serviceReport.engineer = engineer;
},
),
const SizedBox(height: 8,), const SizedBox(height: 8,),
// invoice number & code // invoice number & code
_serviceReport.callLastSituation?.id != 12 ? const SizedBox.shrink(): _serviceReport.callLastSituation?.id != 12 ? const SizedBox.shrink():
@ -347,65 +361,65 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
], ],
), ),
const SizedBox(height: 8,), // const SizedBox(height: 8,),
Row( // Row(
children: [ // children: [
ASubTitle(_subtitle.faultDescription), // ASubTitle(_subtitle.faultDescription),
Expanded( // Expanded(
child: SizedBox( // child: SizedBox(
height: 32 * AppStyle.getScaleFactor(context), // height: 32 * AppStyle.getScaleFactor(context),
child: SpeechToTextButton( // child: SpeechToTextButton(
controller: _faultController, // controller: _faultController,
mini: true, // mini: true,
), // ),
), // ),
), // ),
], // ],
), // ),
const SizedBox(height: 4,), // const SizedBox(height: 4,),
ATextFormField( // ATextFormField(
initialValue: _serviceReport?.faultDescription, // initialValue: _serviceReport?.faultDescriptionId,
textAlign: TextAlign.center, // textAlign: TextAlign.center,
controller: _faultController, // controller: _faultController,
style: Theme.of(context).textTheme.subtitle1, // style: Theme.of(context).textTheme.subtitle1,
validator: (value) => // validator: (value) =>
Validator.hasValue(value) // Validator.hasValue(value)
? null : _subtitle.requiredWord, // ? null : _subtitle.requiredWord,
textInputType: TextInputType.multiline, // textInputType: TextInputType.multiline,
onSaved: (value){ // onSaved: (value){
_serviceReport.faultDescription = value; // _serviceReport.faultDescriptionId = value;
}, // },
), // ),
const SizedBox(height: 8,), // const SizedBox(height: 8,),
Row( // Row(
children: [ // children: [
ASubTitle(_subtitle.workPreformed), // ASubTitle(_subtitle.workPreformed),
Expanded( // Expanded(
child: SizedBox( // child: SizedBox(
height: 32 * AppStyle.getScaleFactor(context), // height: 32 * AppStyle.getScaleFactor(context),
child: SpeechToTextButton( // child: SpeechToTextButton(
controller: _workPreformedController, // controller: _workPreformedController,
mini: true, // mini: true,
), // ),
), // ),
), // ),
], // ],
), // ),
const SizedBox(height: 4,), // const SizedBox(height: 4,),
ATextFormField( // ATextFormField(
initialValue: _serviceReport?.workPreformed, // initialValue: _serviceReport?.workPreformed,
textAlign: TextAlign.center, // textAlign: TextAlign.center,
controller: _workPreformedController, // controller: _workPreformedController,
style: Theme.of(context).textTheme.subtitle1, // style: Theme.of(context).textTheme.subtitle1,
validator: (value) => // validator: (value) =>
Validator.hasValue(value) // Validator.hasValue(value)
? null : _subtitle.requiredWord, // ? null : _subtitle.requiredWord,
textInputType: TextInputType.multiline, // textInputType: TextInputType.multiline,
onSaved: (value){ // onSaved: (value){
_serviceReport.workPreformed = value; // _serviceReport.workPreformed = value;
}, // },
), // ),
const SizedBox(height: 8,), // const SizedBox(height: 8,),
const SizedBox(height: 8,), const SizedBox(height: 8,),
Row( Row(
@ -437,7 +451,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
image: _image, image: _image,
onPick: (image){ onPick: (image){
_image =image; _image =image;
_serviceReport.image = base64Encode(image.readAsBytesSync()); _serviceReport.image = "${image.path.split("/").last}|${base64Encode(image.readAsBytesSync())}";
}, },
), ),
], ],
@ -455,12 +469,18 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
children: [ children: [
ASubTitle(_subtitle.workingHours), ASubTitle(_subtitle.workingHours),
const SizedBox(height: 8,), const SizedBox(height: 8,),
AppTimer( Row(
timer: _serviceReport.timer, children: [
onChange: (timer) async{ Expanded(
_serviceReport.timer = timer; child: AppTimer(
return true; timer: _serviceReport.timer,
}, onChange: (timer) async{
_serviceReport.timer = timer;
return true;
},
),
),
],
), ),
// ATextFormField( // ATextFormField(
// initialValue: _serviceReport?.workHours, // initialValue: _serviceReport?.workHours,
@ -478,79 +498,102 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
], ],
), ),
), ),
const SizedBox(width: 8,), // const SizedBox(width: 8,),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.travelingHours),
const SizedBox(height: 4,),
ATextFormField(
initialValue: _serviceReport?.travelingHours,
textAlign: TextAlign.center,
hintText: "i.e 3, 3.5, 4",
style: Theme.of(context).textTheme.subtitle1,
// validator: (value) =>
// Validator.isNumeric(value)
// ? null : _subtitle.requiredWord,
textInputType: TextInputType.number,
onSaved: (value){
_serviceReport.travelingHours = value;
},
),
],
),
),
],
),
const SizedBox(height: 8,),
// Operating Hours and Job Sheet Number
Row(
children: [
// Expanded( // Expanded(
// child: Column( // child: Column(
// crossAxisAlignment: CrossAxisAlignment.start, // crossAxisAlignment: CrossAxisAlignment.start,
// children: [ // children: [
// ASubTitle(_subtitle.operatingHours), // ASubTitle(_subtitle.travelingHours),
// const SizedBox(height: 4,), // const SizedBox(height: 4,),
// ATextFormField( // ATextFormField(
// initialValue: _serviceReport?.operatingHours, // initialValue: _serviceReport?.travelingHours,
// textAlign: TextAlign.center, // textAlign: TextAlign.center,
// hintText: "i.e 3, 3.5, 4", // hintText: "i.e 3, 3.5, 4",
// style: Theme.of(context).textTheme.subtitle1, // style: Theme.of(context).textTheme.subtitle1,
// validator: (value) => // // validator: (value) =>
// Validator.isNumeric(value) // // Validator.isNumeric(value)
// ? null : _subtitle.requiredWord, // // ? null : _subtitle.requiredWord,
// textInputType: TextInputType.number, // textInputType: TextInputType.number,
// onSaved: (value){ // onSaved: (value){
// _serviceReport.operatingHours = value; // _serviceReport.travelingHours = value;
// }, // },
// ), // ),
// ], // ],
// ), // ),
// ), // ),
// const SizedBox(width: 8,),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ASubTitle(_subtitle.jobSheetNumber),
const SizedBox(height: 4,),
ATextFormField(
initialValue: _serviceReport?.jobSheetNumber,
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1,
textInputType: TextInputType.name,
onSaved: (value){
_serviceReport.jobSheetNumber = value;
},
),
],
),
),
], ],
), ),
const SizedBox(height: 8,), const SizedBox(height: 8,),
// Operating Hours and Job Sheet Number
// Row(
// children: [
// Expanded(
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// ASubTitle(_subtitle.operatingHours),
// const SizedBox(height: 4,),
// ATextFormField(
// initialValue: _serviceReport?.operatingHours,
// textAlign: TextAlign.center,
// hintText: "i.e 3, 3.5, 4",
// style: Theme.of(context).textTheme.subtitle1,
// validator: (value) =>
// Validator.isNumeric(value)
// ? null : _subtitle.requiredWord,
// textInputType: TextInputType.number,
// onSaved: (value){
// _serviceReport.operatingHours = value;
// },
// ),
// ],
// ),
// ),
// const SizedBox(width: 8,),
// Expanded(
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// ASubTitle(_subtitle.jobSheetNumber),
// const SizedBox(height: 4,),
// ATextFormField(
// initialValue: _serviceReport?.jobSheetNumber,
// textAlign: TextAlign.center,
// style: Theme.of(context).textTheme.subtitle1,
// textInputType: TextInputType.name,
// onSaved: (value){
// _serviceReport.jobSheetNumber = value;
// },
// ),
// ],
// ),
// ),
// ],
// ),
//const SizedBox(height: 8,),
const SizedBox(height: 8,),
const ASubTitle("Nurse Signature"),
ESignature(
oldSignature: _serviceReport.signatureNurse,
newSignature: _serviceReport.localNurseSignature,
onChange: (signature){
if(signature == null || signature.isEmpty) {return;}
_serviceReport.localNurseSignature = signature;
_serviceReport.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
},
),
const SizedBox(height: 8,),
const ASubTitle("Engineer Signature"),
ESignature(
oldSignature: _serviceReport.signatureEngineer,
newSignature: _serviceReport.localNurseSignature,
onChange: (signature){
if(signature == null || signature.isEmpty) {return;}
_serviceReport.localNurseSignature = signature;
_serviceReport.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
},
),
const SizedBox(height: 8,),
// Part Number and Quantity // Part Number and Quantity
Row( Row(
children: [ children: [
@ -597,7 +640,6 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
} }
), ),
), ),
const SizedBox(height: 16,), const SizedBox(height: 16,),
], ],

@ -5,7 +5,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.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/localization/localization.dart';
import 'package:test_sa/controllers/providers/api/service_requests_provider.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'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart';
@ -22,12 +22,13 @@ import 'package:test_sa/views/widgets/app_text_form_field.dart';
import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart';
import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.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/equipment/auto_complete_devices_field.dart'; import 'package:test_sa/views/widgets/equipment/auto_complete_devices_field.dart';
import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart'; import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart';
import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart';
import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart';
import 'package:test_sa/views/widgets/parts/part_item.dart'; import 'package:test_sa/views/widgets/parts/part_item.dart';
import 'package:test_sa/views/widgets/speech_to_text/speech_to_text.dart'; import 'package:test_sa/views/widgets/status/employee/engineers_mune.dart';
import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart'; import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart';
import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart'; import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart';
import 'package:test_sa/views/widgets/status/report/service_report_status.dart'; import 'package:test_sa/views/widgets/status/report/service_report_status.dart';
@ -223,14 +224,28 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
), ),
const SizedBox(height: 8,), const SizedBox(height: 8,),
ASubTitle(_subtitle.serviceType), ASubTitle(_subtitle.serviceType),
_validate && _serviceReport.serviceType == null ? _validate && _serviceReport.assetType == null ?
ASubTitle(_subtitle.requiredWord,color: Colors.red,): ASubTitle(_subtitle.requiredWord,color: Colors.red,):
const SizedBox.shrink(), const SizedBox.shrink(),
const SizedBox(height: 4,), const SizedBox(height: 4,),
ServiceStatusMenu( ServiceAssetTypeMenu(
initialValue: _serviceReport.serviceType, initialValue: _serviceReport.assetType,
onSelect: (status){ onSelect: (status){
_serviceReport.serviceType = status; _serviceReport.assetType = status;
},
),
const SizedBox(height: 8,),
SizedBox(height: 8 * AppStyle.getScaleFactor(context),),
const ASubTitle("Assign Employee"),
const SizedBox(height: 8,),
_validate && _serviceReport.engineer == null ?
ASubTitle(_subtitle.requiredWord,color: Colors.red,):
const SizedBox.shrink(),
const SizedBox(height: 4,),
EngineersMenu(
initialValue: _serviceReport.engineer,
onSelect: (engineer){
_serviceReport.engineer = engineer;
}, },
), ),
const SizedBox(height: 8,), const SizedBox(height: 8,),
@ -257,39 +272,40 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
), ),
), ),
const SizedBox(width: 8,), const SizedBox(width: 8,),
Provider.of<ServiceReportLastCallsProvider>(context).isLoading == null Consumer<ServiceReportLastCallsProvider>(
? const SizedBox.shrink(): builder: (_, provider, __) {
// Call's last Situation if(provider.isLoading == null) return const SizedBox.shrink();
Expanded( return Expanded(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
ASubTitle(_subtitle.callLastSituation),
ASubTitle(_subtitle.callLastSituation), _validate && _serviceReport.callLastSituation == null ?
_validate && _serviceReport.callLastSituation == null ? ASubTitle(_subtitle.requiredWord,color: Colors.red,):
ASubTitle(_subtitle.requiredWord,color: Colors.red,): const SizedBox.shrink(),
const SizedBox.shrink(), const SizedBox(height: 4,),
const SizedBox(height: 4,), ServiceReportLastCallsMenu(
ServiceReportLastCallsMenu( report: _serviceReport,
report: _serviceReport, onSelect: (status){
onSelect: (status){ if(status?.value == 12
if(status?.id == 12 || _serviceReport.callLastSituation?.value == 12){
|| _serviceReport.callLastSituation?.id == 12){ _serviceReport.callLastSituation = status;
_serviceReport.callLastSituation = status; setState(() {});
setState(() {}); } else {
} else { _serviceReport.callLastSituation = status;
_serviceReport.callLastSituation = status; }
} },
}, ),
],
), ),
], );
), },
), ),
], ],
), ),
const SizedBox(height: 8,), const SizedBox(height: 8,),
// invoice number & code // invoice number & code
_serviceReport.callLastSituation?.id != 12 ? const SizedBox.shrink(): _serviceReport.callLastSituation?.value != 12 ? const SizedBox.shrink():
Row( Row(
children: [ children: [
Expanded( Expanded(
@ -338,65 +354,65 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
], ],
), ),
const SizedBox(height: 8,), // const SizedBox(height: 8,),
Row( // Row(
children: [ // children: [
ASubTitle(_subtitle.faultDescription), // ASubTitle(_subtitle.faultDescription),
Expanded( // Expanded(
child: SizedBox( // child: SizedBox(
height: 32 * AppStyle.getScaleFactor(context), // height: 32 * AppStyle.getScaleFactor(context),
child: SpeechToTextButton( // child: SpeechToTextButton(
controller: _faultController, // controller: _faultController,
mini: true, // mini: true,
), // ),
), // ),
), // ),
], // ],
), // ),
const SizedBox(height: 4,), // const SizedBox(height: 4,),
ATextFormField( // ATextFormField(
initialValue: _serviceReport?.faultDescription, // initialValue: _serviceReport?.faultDescriptionId,
textAlign: TextAlign.center, // textAlign: TextAlign.center,
controller: _faultController, // controller: _faultController,
style: Theme.of(context).textTheme.subtitle1, // style: Theme.of(context).textTheme.subtitle1,
validator: (value) => // validator: (value) =>
Validator.hasValue(value) // Validator.hasValue(value)
? null : _subtitle.requiredWord, // ? null : _subtitle.requiredWord,
textInputType: TextInputType.multiline, // textInputType: TextInputType.multiline,
onSaved: (value){ // onSaved: (value){
_serviceReport.faultDescription = value; // _serviceReport.faultDescriptionId = value;
}, // },
), // ),
const SizedBox(height: 8,), // const SizedBox(height: 8,),
Row( // Row(
children: [ // children: [
ASubTitle(_subtitle.workPreformed), // ASubTitle(_subtitle.workPreformed),
Expanded( // Expanded(
child: SizedBox( // child: SizedBox(
height: 32 * AppStyle.getScaleFactor(context), // height: 32 * AppStyle.getScaleFactor(context),
child: SpeechToTextButton( // child: SpeechToTextButton(
controller: _workPreformedController, // controller: _workPreformedController,
mini: true, // mini: true,
), // ),
), // ),
), // ),
], // ],
), // ),
const SizedBox(height: 4,), // const SizedBox(height: 4,),
ATextFormField( // ATextFormField(
initialValue: _serviceReport?.workPreformed, // initialValue: _serviceReport?.workPreformed,
textAlign: TextAlign.center, // textAlign: TextAlign.center,
controller: _workPreformedController, // controller: _workPreformedController,
style: Theme.of(context).textTheme.subtitle1, // style: Theme.of(context).textTheme.subtitle1,
validator: (value) => // validator: (value) =>
Validator.hasValue(value) // Validator.hasValue(value)
? null : _subtitle.requiredWord, // ? null : _subtitle.requiredWord,
textInputType: TextInputType.multiline, // textInputType: TextInputType.multiline,
onSaved: (value){ // onSaved: (value){
_serviceReport.workPreformed = value; // _serviceReport.workPreformed = value;
}, // },
), // ),
const SizedBox(height: 8,), // const SizedBox(height: 8,),
const SizedBox(height: 8,), const SizedBox(height: 8,),
Row( Row(
@ -446,12 +462,18 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
children: [ children: [
ASubTitle(_subtitle.workingHours), ASubTitle(_subtitle.workingHours),
const SizedBox(height: 8,), const SizedBox(height: 8,),
AppTimer( Row(
timer: _serviceReport.timer, children: [
onChange: (timer) async{ Expanded(
_serviceReport.timer = timer; child: AppTimer(
return true; timer: _serviceReport.timer,
}, onChange: (timer) async{
_serviceReport.timer = timer;
return true;
},
),
),
],
), ),
// ATextFormField( // ATextFormField(
// initialValue: _serviceReport?.workHours, // initialValue: _serviceReport?.workHours,
@ -469,77 +491,100 @@ class _EditServiceReportState extends State<EditServiceReport> with TickerProvid
], ],
), ),
), ),
const SizedBox(width: 8,), // const SizedBox(width: 8,),
Expanded( // Expanded(
child: Column( // child: Column(
crossAxisAlignment: CrossAxisAlignment.start, // crossAxisAlignment: CrossAxisAlignment.start,
children: [ // children: [
ASubTitle(_subtitle.travelingHours), // ASubTitle(_subtitle.travelingHours),
const SizedBox(height: 4,), // const SizedBox(height: 4,),
ATextFormField( // ATextFormField(
initialValue: _serviceReport?.travelingHours, // initialValue: _serviceReport?.travelingHours,
textAlign: TextAlign.center, // textAlign: TextAlign.center,
hintText: "i.e 3, 3.5, 4", // hintText: "i.e 3, 3.5, 4",
style: Theme.of(context).textTheme.subtitle1, // style: Theme.of(context).textTheme.subtitle1,
validator: (value) => // validator: (value) =>
Validator.isNumeric(value) // Validator.isNumeric(value)
? null : _subtitle.requiredWord, // ? null : _subtitle.requiredWord,
textInputType: TextInputType.number, // textInputType: TextInputType.number,
onSaved: (value){ // onSaved: (value){
_serviceReport.travelingHours = value; // _serviceReport.travelingHours = value;
}, // },
), // ),
], // ],
), // ),
), // ),
], ],
), ),
const SizedBox(height: 8,), const SizedBox(height: 8,),
// Operating Hours and Job Sheet Number // Operating Hours and Job Sheet Number
Row( // Row(
children: [ // children: [
Expanded( // Expanded(
child: Column( // child: Column(
crossAxisAlignment: CrossAxisAlignment.start, // crossAxisAlignment: CrossAxisAlignment.start,
children: [ // children: [
ASubTitle(_subtitle.operatingHours), // ASubTitle(_subtitle.operatingHours),
const SizedBox(height: 4,), // const SizedBox(height: 4,),
ATextFormField( // ATextFormField(
initialValue: _serviceReport?.operatingHours, // initialValue: _serviceReport?.operatingHours,
textAlign: TextAlign.center, // textAlign: TextAlign.center,
hintText: "i.e 3, 3.5, 4", // hintText: "i.e 3, 3.5, 4",
style: Theme.of(context).textTheme.subtitle1, // style: Theme.of(context).textTheme.subtitle1,
validator: (value) => // validator: (value) =>
Validator.isNumeric(value) // Validator.isNumeric(value)
? null : _subtitle.requiredWord, // ? null : _subtitle.requiredWord,
textInputType: TextInputType.number, // textInputType: TextInputType.number,
onSaved: (value){ // onSaved: (value){
_serviceReport.operatingHours = value; // _serviceReport.operatingHours = value;
}, // },
), // ),
], // ],
), // ),
), // ),
const SizedBox(width: 8,), // const SizedBox(width: 8,),
Expanded( // Expanded(
child: Column( // child: Column(
crossAxisAlignment: CrossAxisAlignment.start, // crossAxisAlignment: CrossAxisAlignment.start,
children: [ // children: [
ASubTitle(_subtitle.jobSheetNumber), // ASubTitle(_subtitle.jobSheetNumber),
const SizedBox(height: 4,), // const SizedBox(height: 4,),
ATextFormField( // ATextFormField(
initialValue: _serviceReport?.jobSheetNumber, // initialValue: _serviceReport?.jobSheetNumber,
textAlign: TextAlign.center, // textAlign: TextAlign.center,
style: Theme.of(context).textTheme.subtitle1, // style: Theme.of(context).textTheme.subtitle1,
textInputType: TextInputType.name, // textInputType: TextInputType.name,
onSaved: (value){ // onSaved: (value){
_serviceReport.jobSheetNumber = value; // _serviceReport.jobSheetNumber = value;
}, // },
), // ),
], // ],
), // ),
), // ),
], // ],
// ),
//const SizedBox(height: 8,),
const SizedBox(height: 8,),
const ASubTitle("Nurse Signature"),
ESignature(
oldSignature: _serviceReport.signatureNurse,
newSignature: _serviceReport.localNurseSignature,
onChange: (signature){
if(signature == null || signature.isEmpty) {return;}
_serviceReport.localNurseSignature = signature;
_serviceReport.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
},
),
const SizedBox(height: 8,),
const ASubTitle("Engineer Signature"),
ESignature(
oldSignature: _serviceReport.signatureEngineer,
newSignature: _serviceReport.localNurseSignature,
onChange: (signature){
if(signature == null || signature.isEmpty) {return;}
_serviceReport.localNurseSignature = signature;
_serviceReport.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}";
},
), ),
const SizedBox(height: 8,), const SizedBox(height: 8,),
// Part Number and Quantity // Part Number and Quantity

@ -2,7 +2,6 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart';
import 'package:test_sa/controllers/localization/localization.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/service_requests_provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart';
@ -16,7 +15,6 @@ import 'package:test_sa/views/pages/user/requests/report/create_service_report.d
import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart';
import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart';
import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button.dart';
import 'package:test_sa/views/widgets/dialogs/dialog.dart';
import 'package:test_sa/views/widgets/images/images_list.dart'; import 'package:test_sa/views/widgets/images/images_list.dart';
import 'package:test_sa/views/widgets/loaders/image_loader.dart'; import 'package:test_sa/views/widgets/loaders/image_loader.dart';
import 'package:test_sa/views/widgets/requests/info_row.dart'; import 'package:test_sa/views/widgets/requests/info_row.dart';
@ -25,7 +23,6 @@ import 'package:test_sa/views/widgets/requests/service_request_update_dialog.dar
import 'package:test_sa/views/widgets/sound/sound_player.dart'; import 'package:test_sa/views/widgets/sound/sound_player.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
import '../report_issues_page.dart';
import 'report/future_service_report.dart'; import 'report/future_service_report.dart';
class RequestDetailsPage extends StatelessWidget { class RequestDetailsPage extends StatelessWidget {
static final String id = "/call-details"; static final String id = "/call-details";
@ -61,61 +58,60 @@ class RequestDetailsPage extends StatelessWidget {
), ),
), ),
), ),
Visibility( _userProvider.user.type == UsersTypes.normal_user ?
visible: _userProvider.user.type == UsersTypes.normal_user, // AIconButton(
replacement: AIconButton( // iconData: Icons.warning_amber_rounded,
iconData: Icons.edit, // color: AColors.white,
color: AColors.white, // buttonSize: 42,
buttonSize: 42, // backgroundColor: AColors.deepOrange,
backgroundColor: AColors.green, // onPressed: (){
onPressed: () async { // Navigator.of(context).push(
showModalBottomSheet( // MaterialPageRoute(
// builder: (_) => ReportIssuesPage(serviceRequest: serviceRequest,)
// )
// );
// },
// )
const SizedBox(width: 48,)
: AIconButton(
iconData: Icons.edit,
color: AColors.white,
buttonSize: 42,
backgroundColor: AColors.green,
onPressed: () async {
showModalBottomSheet(
context: context, context: context,
builder: (context){ builder: (context){
return ServiceRequestsUpdateDialog(request: serviceRequest,); return ServiceRequestsUpdateDialog(request: serviceRequest,);
}); });
// DateTime picked = await showDatePicker( // DateTime picked = await showDatePicker(
// context: context, // context: context,
// initialDate: DateTime.now(), // initialDate: DateTime.now(),
// firstDate: DateTime.now(), // firstDate: DateTime.now(),
// lastDate: DateTime.now().add(Duration(days: 182)) // lastDate: DateTime.now().add(Duration(days: 182))
// ); // );
// if(picked == null){return;} // if(picked == null){return;}
// showDialog<void>( // showDialog<void>(
// context: context, // context: context,
// barrierDismissible: false, // barrierDismissible: false,
// builder: (BuildContext context) { // builder: (BuildContext context) {
// return CupertinoAlertDialog( // return CupertinoAlertDialog(
// title: Text(_subtitle.updatingDots), // title: Text(_subtitle.updatingDots),
// content: Center(child: CircularProgressIndicator()), // content: Center(child: CircularProgressIndicator()),
// ); // );
// }, // },
// ); // );
// int status = await _serviceRequestsProvider.updateDate( // int status = await _serviceRequestsProvider.updateDate(
// user: _userProvider.user, // user: _userProvider.user,
// host: _settingProvider.host, // host: _settingProvider.host,
// request: serviceRequest, // request: serviceRequest,
// newDate: picked.toString().split(" ").first // newDate: picked.toString().split(" ").first
// ); // );
// Navigator.of(context).pop(); // Navigator.of(context).pop();
// Fluttertoast.showToast( // Fluttertoast.showToast(
// msg: HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle), // msg: HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle),
// ); // );
}, },
),
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,) SizedBox(width: 16,)
], ],
@ -249,44 +245,45 @@ class RequestDetailsPage extends StatelessWidget {
ASoundPlayer( ASoundPlayer(
audio: serviceRequest.audio, audio: serviceRequest.audio,
), ),
Center( //
child: Padding( // Center(
padding: EdgeInsets.all(32), // child: Padding(
child: AButton( // padding: EdgeInsets.all(32),
text: _subtitle.duplicateRequest, // child: AButton(
onPressed: () async { // text: _subtitle.duplicateRequest,
bool result = await showDialog( // onPressed: () async {
context: context, // bool result = await showDialog(
builder: (_) => AAlertDialog( // context: context,
title: _subtitle.duplicateAlert, // builder: (_) => AAlertDialog(
content: _subtitle.duplicateAlertMessage, // title: _subtitle.duplicateAlert,
) // content: _subtitle.duplicateAlertMessage,
); // )
if(result == true){ // );
showDialog( // if(result == true){
context: context, // showDialog(
builder: (context){ // context: context,
return Center(child: CircularProgressIndicator()); // builder: (context){
} // return Center(child: CircularProgressIndicator());
); // }
int status = await _serviceRequestsProvider.createDuplicatedReport( // );
host: _settingProvider.host, // int status = await _serviceRequestsProvider.createDuplicatedReport(
user: _userProvider.user, // host: _settingProvider.host,
request: serviceRequest // user: _userProvider.user,
); // request: serviceRequest
Navigator.of(context).pop(); // );
ScaffoldMessenger.of(context).showSnackBar( // Navigator.of(context).pop();
SnackBar( // ScaffoldMessenger.of(context).showSnackBar(
content: Text( // SnackBar(
HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle) // content: Text(
) // HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle)
) // )
); // )
} // );
}, // }
), // },
), // ),
) // ),
// )
], ],
), ),
serviceRequest.viewReport ? serviceRequest.viewReport ?
@ -309,7 +306,8 @@ class RequestDetailsPage extends StatelessWidget {
title: _subtitle.jobSheetNumber, title: _subtitle.jobSheetNumber,
info: serviceRequest.jobSheetNumber, info: serviceRequest.jobSheetNumber,
), ),
_userProvider.user.type == UsersTypes.engineer ? _userProvider.user.type == UsersTypes.engineer
&& serviceRequest.reportID != null?
Padding( Padding(
padding: EdgeInsets.all(32), padding: EdgeInsets.all(32),
child: AButton( child: AButton(

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

@ -1,12 +1,14 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart';
import 'package:test_sa/controllers/localization/localization.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/regular_visits_provider.dart';
import 'package:test_sa/controllers/providers/api/user_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/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/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/subtitle.dart';
import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/models/visits/visit.dart';
import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart';
@ -59,19 +61,23 @@ class _EditPentryState extends State<EditPentry> with SingleTickerProviderStateM
Fluttertoast.showToast( Fluttertoast.showToast(
msg: _subtitle.requestCompleteSuccessfully, msg: _subtitle.requestCompleteSuccessfully,
); );
// Navigator.of(context).pop(); Navigator.of(context).pop();
Navigator.of(context).pop();
}else{ }else{
String errorMessage = HttpStatusManger.getStatusMessage( // String errorMessage = HttpStatusManger.getStatusMessage(
status: status, subtitle: _subtitle); // status: status, subtitle: _subtitle);
Fluttertoast.showToast( // Fluttertoast.showToast(
msg: errorMessage, // msg: errorMessage,
); // );
} }
} }
@override @override
void initState() { 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); _tabController = TabController(length: 4, vsync: this);
super.initState(); super.initState();
} }

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

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

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

@ -5,7 +5,7 @@ import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/visits/visit.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/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/pages/user/visits/pantry/future_edit_pently.dart'; import 'package:test_sa/views/pages/user/visits/pantry/edit_pentry.dart';
import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart';
import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button.dart';
import 'package:test_sa/views/widgets/images/images_list.dart'; import 'package:test_sa/views/widgets/images/images_list.dart';
@ -15,7 +15,6 @@ import 'package:test_sa/views/widgets/visits/visit_status.dart';
import '../../../../controllers/providers/api/regular_visits_provider.dart'; import '../../../../controllers/providers/api/regular_visits_provider.dart';
class VisitDetailsPage extends StatelessWidget { class VisitDetailsPage extends StatelessWidget {
static final String id = "/visit-details"; static final String id = "/visit-details";
final Visit visit; final Visit visit;
@ -25,7 +24,6 @@ class VisitDetailsPage extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
Subtitle _subtitle = AppLocalization.of(context).subtitle; Subtitle _subtitle = AppLocalization.of(context).subtitle;
final regularVisitsProvider = Provider.of<RegularVisitsProvider>(context); final regularVisitsProvider = Provider.of<RegularVisitsProvider>(context);
return Scaffold( return Scaffold(
body: SafeArea( body: SafeArea(
child: Column( child: Column(
@ -54,11 +52,11 @@ class VisitDetailsPage extends StatelessWidget {
backgroundColor: AColors.green, backgroundColor: AColors.green,
onPressed: () async { onPressed: () async {
Navigator.of(context).push( Navigator.of(context).push(
MaterialPageRoute(builder: (_)=> FutureEditPentry(visit: visit,)) MaterialPageRoute(builder: (_)=> EditPentry(visit: visit,pentry: visit.pentry,))
); );
}, },
), ),
SizedBox(width: 16,) SizedBox(width: 42)
], ],
), ),
), ),

@ -1,5 +1,5 @@
import 'package:test_sa/views/app_style/sizing.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/views/app_style/sizing.dart';
class AFlatButton extends StatelessWidget { class AFlatButton extends StatelessWidget {
final String text; final String text;

@ -1,6 +1,6 @@
import 'package:test_sa/views/app_style/sizing.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:test_sa/views/app_style/sizing.dart';
class AIconButton2 extends StatelessWidget { class AIconButton2 extends StatelessWidget {
final IconData iconData; final IconData iconData;

@ -1,5 +1,5 @@
import 'package:test_sa/views/app_style/sizing.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/views/app_style/sizing.dart';
class ASmallButton extends StatelessWidget { class ASmallButton extends StatelessWidget {
final String text; final String text;

@ -24,7 +24,6 @@ class ADatePicker extends StatelessWidget {
child: Text( child: Text(
date == null ? "Pick Date" : date == null ? "Pick Date" :
date.toString().split(" ").first, date.toString().split(" ").first,
style: Theme.of(context).textTheme.subtitle2,
textScaleFactor: AppStyle.getScaleFactor(context), textScaleFactor: AppStyle.getScaleFactor(context),
), ),
onPressed: () async { onPressed: () async {

@ -1,11 +1,11 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/department.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/departments/single_department_picker.dart'; import 'package:test_sa/views/widgets/departments/single_department_picker.dart';
class DepartmentButton extends StatelessWidget { class DepartmentButton extends StatelessWidget {
final Function(Department) onDepartmentPick; final Function(Department) onDepartmentPick;
final Department department; final Department department;

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

@ -1,21 +1,14 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/localization/localization.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/api/user_provider.dart';
import 'package:test_sa/models/device/device_transfer.dart'; import 'package:test_sa/models/device/device_transfer.dart';
import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/gas_refill/gas_refill_model.dart';
import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/pages/user/requests/report/create_service_report.dart';
import 'package:test_sa/views/pages/user/requests/report/future_service_report.dart';
import 'package:test_sa/views/widgets/loaders/image_loader.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:provider/provider.dart';
class DeviceTransferItem extends StatelessWidget { class DeviceTransferItem extends StatelessWidget {
final int index; final int index;
final DeviceTransfer item; final DeviceTransfer item;
@ -79,7 +72,7 @@ class DeviceTransferItem extends StatelessWidget {
), ),
StatusLabel( StatusLabel(
color: AColors.getRequestStatusColor(item.sender.status?.id), color: AColors.getRequestStatusColor(item.sender.status?.id),
label: item.sender.status?.label, label: item.sender.status?.name,
) )
], ],
@ -99,6 +92,7 @@ class DeviceTransferItem extends StatelessWidget {
], ],
), ),
if(item.sender.department.id != null)
Text( Text(
item.sender.department.name, item.sender.department.name,
style: Theme.of(context).textTheme.bodySmall.copyWith( style: Theme.of(context).textTheme.bodySmall.copyWith(
@ -118,7 +112,7 @@ class DeviceTransferItem extends StatelessWidget {
), ),
StatusLabel( StatusLabel(
color: AColors.getRequestStatusColor(item.receiver.status?.id), color: AColors.getRequestStatusColor(item.receiver.status?.id),
label: item.receiver.status?.label, label: item.receiver.status?.name,
) )
], ],
@ -138,6 +132,7 @@ class DeviceTransferItem extends StatelessWidget {
], ],
), ),
if(item.receiver.department.id != null)
Text( Text(
item.receiver.department.name, item.receiver.department.name,
style: Theme.of(context).textTheme.bodySmall.copyWith( style: Theme.of(context).textTheme.bodySmall.copyWith(

@ -1,7 +1,7 @@
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/models/subtitle.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/models/subtitle.dart';
class AAlertDialog extends StatelessWidget { class AAlertDialog extends StatelessWidget {
final String title; final String title;
final String content; final String content;

@ -9,7 +9,8 @@ class ESignature extends StatefulWidget {
final String oldSignature; final String oldSignature;
final Uint8List newSignature; final Uint8List newSignature;
final Function(Uint8List) onSaved; final Function(Uint8List) onSaved;
const ESignature({Key key, this.oldSignature, this.onSaved, this.newSignature}) : super(key: key); final Function(Uint8List) onChange;
const ESignature({Key key, this.oldSignature, this.onSaved,this.onChange, this.newSignature}) : super(key: key);
@override @override
State<ESignature> createState() => _ESignatureState(); State<ESignature> createState() => _ESignatureState();
@ -102,6 +103,7 @@ class _ESignatureState extends State<ESignature> {
const Spacer(), const Spacer(),
IconButton(onPressed: () async { IconButton(onPressed: () async {
signature = await _controller.toPngBytes(); signature = await _controller.toPngBytes();
widget.onChange(signature);
setState(() {}); setState(() {});
}, icon: const Icon(Icons.check)), }, icon: const Icon(Icons.check)),
], ],

@ -9,8 +9,8 @@ import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
class AutoCompleteDeviceField extends StatefulWidget { class AutoCompleteDeviceField extends StatefulWidget {
final Device initialValue; final Device initialValue;
final String hospitalId; final int hospitalId;
final Function(String) onPick; final Function(int) onPick;
const AutoCompleteDeviceField({Key key, this.initialValue, this.onPick, this.hospitalId}) : super(key: key); const AutoCompleteDeviceField({Key key, this.initialValue, this.onPick, this.hospitalId}) : super(key: key);
@ -42,52 +42,65 @@ class _AutoCompleteDeviceFieldState extends State<AutoCompleteDeviceField> {
_userProvider = Provider.of<UserProvider>(context); _userProvider = Provider.of<UserProvider>(context);
_devicesProvider = Provider.of<DevicesProvider>(context); _devicesProvider = Provider.of<DevicesProvider>(context);
//Subtitle _subtitle = AppLocalization.of(context).subtitle; //Subtitle _subtitle = AppLocalization.of(context).subtitle;
return Container( return LoadingManager(
padding: const EdgeInsets.symmetric( isLoading: _devicesProvider.isLoading,
horizontal: 16 isFailedLoading: _devicesProvider.devices == null,
), stateCode: _devicesProvider.stateCode,
decoration: BoxDecoration( onRefresh: () async {
color: Colors.white, _devicesProvider.reset();
border: Border.all(color:AColors.black), await _devicesProvider.getEquipment(
borderRadius: BorderRadius.circular( host: _settingProvider.host,
AppStyle.borderRadius * AppStyle.getScaleFactor(context) user: _userProvider.user,
hospitalId: widget.hospitalId
);
},
child: 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
]
), ),
boxShadow: [ child: TypeAheadField<Device>(
AppStyle.boxShadow textFieldConfiguration: TextFieldConfiguration(
] style: Theme.of(context).textTheme.headline6,
), controller: _controller,
child: TypeAheadField<Device>( textAlign: TextAlign.center,
textFieldConfiguration: TextFieldConfiguration( decoration: const InputDecoration(
style: Theme.of(context).textTheme.headline6, border: InputBorder.none,
controller: _controller, disabledBorder: InputBorder.none,
textAlign: TextAlign.center, focusedBorder: InputBorder.none,
decoration: const InputDecoration( enabledBorder: InputBorder.none,
border: InputBorder.none, ),
disabledBorder: InputBorder.none, textInputAction: TextInputAction.search,
focusedBorder: InputBorder.none,
enabledBorder: InputBorder.none,
), ),
textInputAction: TextInputAction.search, suggestionsCallback: (value) async {
return await _devicesProvider.getDevicesList(
host: _settingProvider.host,
user: _userProvider.user,
hospitalId: widget.hospitalId ?? _userProvider.user.hospital.id,
serialNumber: value,
);
},
itemBuilder: (context, device) {
return ListTile(
title: Text(device.serialNumber),
subtitle: Text("${device.modelDefinition.modelName}/${device.modelDefinition.manufacturerName}"),
);
},
onSuggestionSelected: (device) {
_controller.text = device.serialNumber;
widget.onPick(device.id);
},
),
), ),
suggestionsCallback: (value) async {
return await _devicesProvider.getDevicesList(
host: _settingProvider.host,
user: _userProvider.user,
hospitalId: widget.hospitalId,
serialNumber: value,
);
},
itemBuilder: (context, device) {
return ListTile(
title: Text(device.serialNumber),
subtitle: Text(device.model+"/"+device.brand),
);
},
onSuggestionSelected: (device) {
_controller.text = device.serialNumber;
widget.onPick(device.id);
},
),
); );
} }
} }

@ -0,0 +1,90 @@
import 'package:flutter/material.dart';
import 'package:flutter_typeahead/flutter_typeahead.dart';
import 'package:provider/provider.dart';
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/lookup.dart';
import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.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);
},
),
);
}
}

@ -1,11 +1,11 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/device/device.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/equipment/single_device_picker.dart'; import 'package:test_sa/views/widgets/equipment/single_device_picker.dart';
class DeviceButton extends StatelessWidget { class DeviceButton extends StatelessWidget {
final Function(Device) onDevicePick; final Function(Device) onDevicePick;
final Device device; final Device device;
@ -27,6 +27,11 @@ class DeviceButton extends StatelessWidget {
), ),
child: Row( child: Row(
children: [ children: [
FaIcon(
FontAwesomeIcons.hardDrive,
size: 28,
color: AColors.black,
),
device == null device == null
? Expanded( ? Expanded(
child: Padding( child: Padding(

@ -28,7 +28,7 @@ class DeviceItem extends StatelessWidget {
onPressed(device); onPressed(device);
}, },
child: ListTile( child: ListTile(
title: Text("${_subtitle.sn} : " + device.serialNumber, title: Text("${_subtitle.sn} : ${device.serialNumber}",
style: Theme.of(context).textTheme.headline6.copyWith( style: Theme.of(context).textTheme.headline6.copyWith(
color: AColors.white color: AColors.white
), ),
@ -38,13 +38,13 @@ class DeviceItem extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Divider(color: Theme.of(context).scaffoldBackgroundColor,), Divider(color: Theme.of(context).scaffoldBackgroundColor,),
Text("${_subtitle.brand} : " + device.brand, Text("${_subtitle.brand} : ${device.modelDefinition.manufacturerName}",
style: Theme.of(context).textTheme.subtitle1.copyWith( style: Theme.of(context).textTheme.subtitle1.copyWith(
color: AColors.white color: AColors.white
), ),
), ),
Divider(color: Theme.of(context).scaffoldBackgroundColor,), Divider(color: Theme.of(context).scaffoldBackgroundColor,),
Text("${_subtitle.model} : " + device.model, Text("${_subtitle.model} : ${device.modelDefinition.modelName}",
style: Theme.of(context).textTheme.subtitle1.copyWith( style: Theme.of(context).textTheme.subtitle1.copyWith(
color: AColors.white color: AColors.white
), ),

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

@ -15,7 +15,7 @@ class GasRefillCreateDetailsItem extends StatelessWidget {
children: [ children: [
Row( Row(
children: [ children: [
Expanded(child: Text(model.type.label)), Expanded(child: Text(model.type.name)),
IconButton( IconButton(
onPressed: onDelete, onPressed: onDelete,
color: AColors.red, color: AColors.red,
@ -23,9 +23,12 @@ class GasRefillCreateDetailsItem extends StatelessWidget {
) )
], ],
), ),
Row( Wrap(
spacing: 10,
children: [ 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) if(model.deliveredQuantity != null)

@ -1,20 +1,14 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/localization/localization.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/api/user_provider.dart';
import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; import 'package:test_sa/models/gas_refill/gas_refill_model.dart';
import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/user.dart';
import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/pages/user/requests/report/create_service_report.dart';
import 'package:test_sa/views/pages/user/requests/report/future_service_report.dart';
import 'package:test_sa/views/widgets/loaders/image_loader.dart';
import 'package:test_sa/views/widgets/requests/request_status.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:provider/provider.dart';
class GasRefillItem extends StatelessWidget { class GasRefillItem extends StatelessWidget {
final int index; final int index;
final GasRefillModel item; final GasRefillModel item;
@ -75,6 +69,7 @@ class GasRefillItem extends StatelessWidget {
), ),
), ),
), ),
if(item.clientName != null)
Text( Text(
item.clientName, item.clientName,
style: Theme.of(context).textTheme.subtitle2.copyWith( style: Theme.of(context).textTheme.subtitle2.copyWith(
@ -95,7 +90,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) color: AColors.getGasStatusColor(item.status.id)
), ),
], ],

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

@ -8,20 +8,19 @@ import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/hospitals/hospital_item.dart';
class HospitalAutoCompleteField extends StatefulWidget { class HospitalAutoCompleteField extends StatefulWidget {
final String initialValue; final String initialValue;
final Function(String) onSearch; final Function(Hospital) onSearch;
final Function(String) onSave; //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 @override
_HospitalAutoCompleteFieldState createState() => _HospitalAutoCompleteFieldState(); _HospitalAutoCompleteFieldState createState() => _HospitalAutoCompleteFieldState();
} }
class _HospitalAutoCompleteFieldState extends State<HospitalAutoCompleteField> { class _HospitalAutoCompleteFieldState extends State<HospitalAutoCompleteField> {
SettingProvider _settingProvider; SettingProvider _settingProvider;
TextEditingController _controller; TextEditingController _controller;
@ -55,8 +54,7 @@ class _HospitalAutoCompleteFieldState extends State<HospitalAutoCompleteField> {
), ),
child: TypeAheadField<Hospital>( child: TypeAheadField<Hospital>(
textFieldConfiguration: TextFieldConfiguration( textFieldConfiguration: TextFieldConfiguration(
style: Theme.of(context).textTheme.headline6, style: Theme.of(context).textTheme.headline6,
onSubmitted: widget.onSave,
controller: _controller, controller: _controller,
textAlign: TextAlign.center, textAlign: TextAlign.center,
decoration: InputDecoration( decoration: InputDecoration(
@ -67,19 +65,17 @@ class _HospitalAutoCompleteFieldState extends State<HospitalAutoCompleteField> {
enabledBorder: InputBorder.none, enabledBorder: InputBorder.none,
), ),
textInputAction: TextInputAction.search, textInputAction: TextInputAction.search,
onEditingComplete: () { ),
widget.onSearch(_controller.text);
}),
suggestionsCallback: (vale) async { suggestionsCallback: (vale) async {
return await HospitalsProvider().getHospitalsList(host: _settingProvider.host, title: vale); return await HospitalsProvider().getHospitalsList(host: _settingProvider.host, title: vale);
}, },
itemBuilder: (context, hospital) { itemBuilder: (context, hospital) {
return HospitalItem( return ListTile(
hospital: hospital, title: Text(hospital.name),
); );
}, },
onSuggestionSelected: (hospital) { onSuggestionSelected: (hospital) {
widget.onSearch(hospital.name); widget.onSearch(hospital);
}, },
), ),
); );

@ -1,11 +1,11 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/hospital.dart';
import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/subtitle.dart';
import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/colors.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
import 'package:test_sa/views/widgets/hospitals/single_hospital_picker.dart'; import 'package:test_sa/views/widgets/hospitals/single_hospital_picker.dart';
class HospitalButton extends StatelessWidget { class HospitalButton extends StatelessWidget {
final Function(Hospital) onHospitalPick; final Function(Hospital) onHospitalPick;
final Hospital hospital; final Hospital hospital;

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

Loading…
Cancel
Save