diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index 49ce0e4d..dad15d8d 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -300,6 +300,7 @@ class URLs { static get getPentry => "$_baseUrl/return/pentry/details"; // get static get updatePentry => "$_baseUrl/Visit/UpdateVisit"; // get static get getPentryTaskStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=403"; // get + // get static get getPentryVisitStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=402"; // get static get getPentryStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=401"; // get // contacts @@ -310,4 +311,14 @@ class URLs { static get getSiteContactInfo => "$_baseUrl/AssetGroupSiteContactInfo"; // add static get getDepartmentBasedOnSite => "$_baseUrl/TRAFDataSource/GetDepartmentBasedOnSite"; // add + +//internal Audit + static get getInternalAuditEquipmentById => "$_baseUrl/InternalAuditEquipments/GetInternalAuditEquipmentById"; + static get getInternalAuditSystemById => "$_baseUrl/InternalAuditSystems/GetInternalAuditSystemById"; + static get getInternalAuditChecklist => "$_baseUrl/Lookups/GetLookup?lookupEnum=43"; + static get getInternalAuditWoType => "$_baseUrl/Lookups/GetLookup?lookupEnum=2500"; + static get getInternalAuditFindingType => "$_baseUrl/Lookups/GetLookup?lookupEnum=2502"; + static get addOrUpdateEquipmentInternalAudit => "$_baseUrl/InternalAuditEquipments/AddOrUpdateAuditEquipment"; + static get getWoAutoComplete => "$_baseUrl/InternalAuditSystems/AutoCompleteAllWorkOrder"; + } diff --git a/lib/controllers/providers/api/all_requests_provider.dart b/lib/controllers/providers/api/all_requests_provider.dart index 71d1f46f..99f77a02 100644 --- a/lib/controllers/providers/api/all_requests_provider.dart +++ b/lib/controllers/providers/api/all_requests_provider.dart @@ -140,9 +140,8 @@ class AllRequestsProvider extends ChangeNotifier { return list; } if (context.userProvider.isQualityUser) { - //TODO Need to replace with actual number.. - // list = [10]; - list = [1]; + + list = [10,11]; return list; } diff --git a/lib/dashboard_latest/widgets/request_category_list.dart b/lib/dashboard_latest/widgets/request_category_list.dart index c92ab6b2..639b3e6a 100644 --- a/lib/dashboard_latest/widgets/request_category_list.dart +++ b/lib/dashboard_latest/widgets/request_category_list.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/new_models/dashboard_detail.dart'; -import 'package:test_sa/modules/internal_audit_module/pages/internal_audit_item_view.dart'; +import 'package:test_sa/modules/internal_audit_module/pages/equipment_internal_audit/equipment_internal_audit_item_view.dart'; import 'package:test_sa/modules/tm_module/tasks_wo/task_request_item_view.dart'; import 'package:test_sa/modules/traf_module/traf_request_item_view.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; @@ -54,7 +54,9 @@ class RequestCategoryList extends StatelessWidget { return TrafRequestItemView(requestData: request); //TODO need to verify this ... case 10: - return InternalAuditItemView(requestData: request); + return EquipmentInternalAuditItemView(requestData: request); + case 11: + return EquipmentInternalAuditItemView(requestData: request); default: return Container( height: 100, diff --git a/lib/main.dart b/lib/main.dart index 2ee8fd64..a2f9bdca 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -29,10 +29,11 @@ import 'package:test_sa/controllers/providers/api/status_drop_down/report/servic import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_types_provider.dart'; import 'package:test_sa/modules/cm_module/service_request_detail_provider.dart'; import 'package:test_sa/modules/cm_module/views/nurse/create_new_request_view.dart'; -import 'package:test_sa/modules/internal_audit_module/pages/create_equipment_internal_audit_form.dart'; -import 'package:test_sa/modules/internal_audit_module/pages/create_system_internal_audit_form.dart'; +import 'package:test_sa/modules/internal_audit_module/pages/equipment_internal_audit/create_equipment_internal_audit_form.dart'; +import 'package:test_sa/modules/internal_audit_module/pages/system_internal_audit/create_system_internal_audit_form.dart'; import 'package:test_sa/modules/internal_audit_module/provider/internal_audit_finding_type_provider.dart'; import 'package:test_sa/modules/internal_audit_module/provider/internal_audit_provider.dart'; +import 'package:test_sa/modules/internal_audit_module/provider/internal_audit_wo_type_provider.dart'; import 'package:test_sa/modules/tm_module/tasks_wo/create_task_view.dart'; import 'package:test_sa/modules/traf_module/create_traf_request_page.dart'; import 'package:test_sa/modules/traf_module/traf_request_provider.dart'; @@ -292,6 +293,7 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider(create: (_) => CommentsProvider()), ChangeNotifierProvider(create: (_) => GasRefillCommentsProvider()), ChangeNotifierProvider(create: (_) => InternalAuditCheckListProvider()), + ChangeNotifierProvider(create: (_) => InternalAuditWoTypeProvider()), ChangeNotifierProvider(create: (_) => InternalAuditProvider()), ChangeNotifierProvider(create: (_) => InternalAuditFindingTypeProvider()), diff --git a/lib/modules/internal_audit_module/models/equipment_internal_audit_data_model.dart b/lib/modules/internal_audit_module/models/equipment_internal_audit_data_model.dart new file mode 100644 index 00000000..411789ec --- /dev/null +++ b/lib/modules/internal_audit_module/models/equipment_internal_audit_data_model.dart @@ -0,0 +1,284 @@ + class EquipmentInternalAuditDataModel { + int? id; + String? requestNo; + String? createdDate; + int? requestNoSequence; + Auditor? auditor; + Status? status; + Asset? asset; + AssignEmployee? assignEmployee; + dynamic manufacture; + String? remarks; + List? equipmentsFindings; + List? attachments; + + EquipmentInternalAuditDataModel({ + this.id, + this.requestNo, + this.createdDate, + this.requestNoSequence, + this.auditor, + this.status, + this.asset, + this.assignEmployee, + this.manufacture, + this.remarks, + this.equipmentsFindings, + this.attachments, + }); + + EquipmentInternalAuditDataModel.fromJson(Map json) { + id = json['id']; + requestNo = json['requestNo']; + createdDate = json['createdDate']; + requestNoSequence = json['requestNoSequence']; + auditor = json['auditor'] != null ? Auditor.fromJson(json['auditor']) : null; + status = json['status'] != null ? Status.fromJson(json['status']) : null; + asset = json['asset'] != null ? Asset.fromJson(json['asset']) : null; + assignEmployee = json['assignEmployee'] != null ? AssignEmployee.fromJson(json['assignEmployee']) : null; + manufacture = json['manufacture']; + remarks = json['remarks']; + if (json['equipmentsFindings'] != null) { + equipmentsFindings = []; + json['equipmentsFindings'].forEach((v) { + equipmentsFindings!.add(EquipmentsFinding.fromJson(v)); + }); + } + attachments = json['attachments'] != null ? List.from(json['attachments']) : []; + } + + Map toJson() { + final Map data = {}; + data['id'] = id; + data['requestNo'] = requestNo; + data['createdDate'] = createdDate; + data['requestNoSequence'] = requestNoSequence; + if (auditor != null) { + data['auditor'] = auditor!.toJson(); + } + if (status != null) { + data['status'] = status!.toJson(); + } + if (asset != null) { + data['asset'] = asset!.toJson(); + } + if (assignEmployee != null) { + data['assignEmployee'] = assignEmployee!.toJson(); + } + data['manufacture'] = manufacture; + data['remarks'] = remarks; + if (equipmentsFindings != null) { + data['equipmentsFindings'] = + equipmentsFindings!.map((v) => v.toJson()).toList(); + } + data['attachments'] = attachments; + return data; + } +} + +class Auditor { + String? userId; + String? userName; + String? email; + String? employeeId; + int? languageId; + String? extensionNo; + String? phoneNumber; + bool? isActive; + + Auditor({ + this.userId, + this.userName, + this.email, + this.employeeId, + this.languageId, + this.extensionNo, + this.phoneNumber, + this.isActive, + }); + + Auditor.fromJson(Map json) { + userId = json['userId']; + userName = json['userName']; + email = json['email']; + employeeId = json['employeeId']; + languageId = json['languageId']; + extensionNo = json['extensionNo']; + phoneNumber = json['phoneNumber']; + isActive = json['isActive']; + } + + Map toJson() { + final Map data = {}; + data['userId'] = userId; + data['userName'] = userName; + data['email'] = email; + data['employeeId'] = employeeId; + data['languageId'] = languageId; + data['extensionNo'] = extensionNo; + data['phoneNumber'] = phoneNumber; + data['isActive'] = isActive; + return data; + } +} + +class Status { + int? id; + String? name; + int? value; + + Status({this.id, this.name, this.value}); + + Status.fromJson(Map json) { + id = json['id']; + name = json['name']; + value = json['value']; + } + + Map toJson() { + final Map data = {}; + data['id'] = id; + data['name'] = name; + data['value'] = value; + return data; + } +} + +class Asset { + int? id; + String? assetNumber; + String? assetSerialNo; + String? assetName; + String? modelName; + String? manufacturerName; + String? siteName; + int? siteId; + String? modelDefinition; + + Asset({ + this.id, + this.assetNumber, + this.assetSerialNo, + this.assetName, + this.modelName, + this.manufacturerName, + this.siteName, + this.siteId, + this.modelDefinition, + }); + + Asset.fromJson(Map json) { + id = json['id']; + assetNumber = json['assetNumber']; + assetSerialNo = json['assetSerialNo']; + assetName = json['assetName']; + modelName = json['modelName']; + manufacturerName = json['manufacturerName']; + siteName = json['siteName']; + siteId = json['siteId']; + modelDefinition = json['modelDefinition']; + } + + Map toJson() { + final Map data = {}; + data['id'] = id; + data['assetNumber'] = assetNumber; + data['assetSerialNo'] = assetSerialNo; + data['assetName'] = assetName; + data['modelName'] = modelName; + data['manufacturerName'] = manufacturerName; + data['siteName'] = siteName; + data['siteId'] = siteId; + data['modelDefinition'] = modelDefinition; + return data; + } +} + +class AssignEmployee { + String? userId; + String? userName; + String? email; + String? employeeId; + int? languageId; + String? extensionNo; + String? phoneNumber; + bool? isActive; + + AssignEmployee({ + this.userId, + this.userName, + this.email, + this.employeeId, + this.languageId, + this.extensionNo, + this.phoneNumber, + this.isActive, + }); + + AssignEmployee.fromJson(Map json) { + userId = json['userId']; + userName = json['userName']; + email = json['email']; + employeeId = json['employeeId']; + languageId = json['languageId']; + extensionNo = json['extensionNo']; + phoneNumber = json['phoneNumber']; + isActive = json['isActive']; + } + + Map toJson() { + final Map data = {}; + data['userId'] = userId; + data['userName'] = userName; + data['email'] = email; + data['employeeId'] = employeeId; + data['languageId'] = languageId; + data['extensionNo'] = extensionNo; + data['phoneNumber'] = phoneNumber; + data['isActive'] = isActive; + return data; + } +} + +class EquipmentsFinding { + int? id; + Finding? finding; + + EquipmentsFinding({this.id, this.finding}); + + EquipmentsFinding.fromJson(Map json) { + id = json['id']; + finding = json['finding'] != null ? Finding.fromJson(json['finding']) : null; + } + + Map toJson() { + final Map data = {}; + data['id'] = id; + if (finding != null) { + data['finding'] = finding!.toJson(); + } + return data; + } +} + +class Finding { + int? id; + String? name; + int? value; + + Finding({this.id, this.name, this.value}); + + Finding.fromJson(Map json) { + id = json['id']; + name = json['name']; + value = json['value']; + } + + Map toJson() { + final Map data = {}; + data['id'] = id; + data['name'] = name; + data['value'] = value; + return data; + } +} diff --git a/lib/modules/internal_audit_module/models/equipment_internal_audit_form_model.dart b/lib/modules/internal_audit_module/models/equipment_internal_audit_form_model.dart new file mode 100644 index 00000000..e6a79e91 --- /dev/null +++ b/lib/modules/internal_audit_module/models/equipment_internal_audit_form_model.dart @@ -0,0 +1,41 @@ +import 'package:flutter/src/widgets/framework.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/extensions/context_extension.dart'; +import 'package:test_sa/models/device/asset.dart'; +import 'package:test_sa/models/fault_description.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/modules/internal_audit_module/models/internal_audit_attachment_model.dart'; + +class EquipmentInternalAuditFormModel { + int? id=0; + String? deviceArName; + String? auditorId; + String? woOrderNo; + List? devicePhotos; + List findings =[]; + List attachments = []; + String? remarks; + Asset? device; + EquipmentInternalAuditFormModel({ + this.id, + this.deviceArName, + this.auditorId, + this.devicePhotos, + this.woOrderNo, + this.remarks, + }); + + Map toJson() { + return { + 'id': id??0, + 'assetId': device?.id, + 'auditorId': auditorId, + 'findings': findings.map((e) => {'findingId': e.value}).toList(), + 'attachments': attachments.map((e) => e.toJson()).toList(), + 'remarks': remarks, + }; + } + + +} \ No newline at end of file diff --git a/lib/modules/internal_audit_module/models/internal_audit_attachment_model.dart b/lib/modules/internal_audit_module/models/internal_audit_attachment_model.dart new file mode 100644 index 00000000..a81f2d17 --- /dev/null +++ b/lib/modules/internal_audit_module/models/internal_audit_attachment_model.dart @@ -0,0 +1,23 @@ +class InternalAuditAttachments { + InternalAuditAttachments({this.id,this.originalName, this.name,this.createdBy}); + + int? id; + String? name; + String? originalName; + String ?createdBy; + InternalAuditAttachments.fromJson(Map json) { + id = json['id']; + name = json['name']; + originalName = json['originalName']; + createdBy = json['createdBy']; + } + + Map toJson() { + final Map data = {}; + // data['id'] = id; + data['name'] = name; + data['originalName'] = originalName; + // data['createdBy'] = createdBy; + return data; + } +} \ No newline at end of file diff --git a/lib/modules/internal_audit_module/models/internal_audit_model.dart b/lib/modules/internal_audit_module/models/internal_audit_model.dart deleted file mode 100644 index 693b384d..00000000 --- a/lib/modules/internal_audit_module/models/internal_audit_model.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:flutter/src/widgets/framework.dart'; -import 'package:fluttertoast/fluttertoast.dart'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/extensions/context_extension.dart'; -import 'package:test_sa/models/device/asset.dart'; -import 'package:test_sa/models/fault_description.dart'; -import 'package:test_sa/models/lookup.dart'; - -class InternalAuditModel { - String? id; - int? deviceId; - String? deviceArName; - String? woOrderNo; - List? devicePhotos; - Lookup? auditCheckList; - String? comments; - Asset? device; - - InternalAuditModel({ - this.id, - this.deviceArName, - this.devicePhotos, - this.deviceId, - this.woOrderNo, - this.comments, - }); - -} - diff --git a/lib/modules/internal_audit_module/models/system_internal_audit_form_model.dart b/lib/modules/internal_audit_module/models/system_internal_audit_form_model.dart new file mode 100644 index 00000000..9750e9e0 --- /dev/null +++ b/lib/modules/internal_audit_module/models/system_internal_audit_form_model.dart @@ -0,0 +1,82 @@ + +import 'dart:developer'; + +import 'package:test_sa/models/lookup.dart'; + +class SystemInternalAuditFormModel { + int? id = 0; + String? auditorId; + String? assignEmployeeId; + Lookup? findingType; + String? findingDescription; + Lookup? workOrderType; + int? correctiveMaintenanceId; + int? planPreventiveVisitId; + int? assetTransferId; + int? taskJobId; + int? taskAlertJobId; + int? gasRefillId; + int? planRecurrentTaskId; + int? statusId; + + SystemInternalAuditFormModel({ + this.id, + this.auditorId, + this.assignEmployeeId, + this.findingType, + this.findingDescription, + this.workOrderType, + this.correctiveMaintenanceId, + this.planPreventiveVisitId, + this.assetTransferId, + this.taskJobId, + this.taskAlertJobId, + this.gasRefillId, + this.planRecurrentTaskId, + this.statusId, + }); + + Map toJson() { + return { + 'id': id, + 'auditorId': auditorId, + 'assignEmployeeId': assignEmployeeId, + 'findingTypeId': findingType?.id, + 'findingDescription': findingDescription, + 'workOrderTypeId': workOrderType?.id, + 'correctiveMaintenanceId': correctiveMaintenanceId, + 'planPreventiveVisitId': planPreventiveVisitId, + 'assetTransferId': assetTransferId, + 'taskJobId': taskJobId, + 'taskAlertJobId': taskAlertJobId, + 'gasRefillId': gasRefillId, + 'planRecurrentTaskId': planRecurrentTaskId, + 'statusId': statusId, + }; + } +} + +class WoAutoCompleteModel { + int? id; + String? workOrderNo; + String? displayName; + + WoAutoCompleteModel({this.id, this.workOrderNo, this.displayName}); + + WoAutoCompleteModel.fromJson(Map json) { + id = json['id']; + workOrderNo = json['workOrderNo']; + displayName = json['workOrderNo']; + } + + Map toJson() { + final Map data = {}; + data['id'] =id; + data['woOrderNo'] = workOrderNo; + data['displayName'] = workOrderNo; + return data; + } +} + + + diff --git a/lib/modules/internal_audit_module/pages/create_equipment_internal_audit_form.dart b/lib/modules/internal_audit_module/pages/equipment_internal_audit/create_equipment_internal_audit_form.dart similarity index 71% rename from lib/modules/internal_audit_module/pages/create_equipment_internal_audit_form.dart rename to lib/modules/internal_audit_module/pages/equipment_internal_audit/create_equipment_internal_audit_form.dart index 83655836..db29aee6 100644 --- a/lib/modules/internal_audit_module/pages/create_equipment_internal_audit_form.dart +++ b/lib/modules/internal_audit_module/pages/equipment_internal_audit/create_equipment_internal_audit_form.dart @@ -9,24 +9,24 @@ import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/generic_attachment_model.dart'; -import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/modules/cm_module/utilities/service_request_utils.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; -import 'package:test_sa/modules/internal_audit_module/models/internal_audit_model.dart'; +import 'package:test_sa/modules/internal_audit_module/models/equipment_internal_audit_form_model.dart'; +import 'package:test_sa/modules/internal_audit_module/models/internal_audit_attachment_model.dart'; import 'package:test_sa/modules/internal_audit_module/provider/internal_audit_checklist_provider.dart'; import 'package:test_sa/modules/internal_audit_module/provider/internal_audit_provider.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart'; import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart'; -import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart'; +import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; +import 'package:test_sa/new_views/common_widgets/multiple_item_drop_down_menu.dart'; import 'package:test_sa/views/widgets/equipment/asset_picker.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; -import '../../../../../../new_views/common_widgets/default_app_bar.dart'; class CreateEquipmentInternalAuditForm extends StatefulWidget { - static const String id = "/create-internal-audit-view"; + static const String id = "/create-equipment-internal-audit-form"; const CreateEquipmentInternalAuditForm({Key? key}) : super(key: key); @@ -36,10 +36,11 @@ class CreateEquipmentInternalAuditForm extends StatefulWidget { class _CreateEquipmentInternalAuditFormState extends State with TickerProviderStateMixin { late TextEditingController _commentController; - final InternalAuditModel _internalAuditModel = InternalAuditModel(); - final List _deviceImages = []; + final EquipmentInternalAuditFormModel _equipmentinternalAuditModel = EquipmentInternalAuditFormModel(); + final List _attachments = []; final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); + FocusNode auditCheckListNode = FocusNode(); @override void initState() { @@ -68,28 +69,27 @@ class _CreateEquipmentInternalAuditFormState extends State( + //TODO need to check layout issue... + MultipleItemDropDownMenu( context: context, - height: 56.toScreenHeight, - title: 'Internal Audit Checklist'.addTranslation, - showShadow: false, - initialValue: _internalAuditModel.auditCheckList, - backgroundColor: AppColor.fieldBgColor(context), showAsBottomSheet: true, - onSelect: (status) { - if (status != null) { - _internalAuditModel.auditCheckList = status; - setState(() {}); - } + backgroundColor: AppColor.neutral100, + showShadow: false, + showCancel: true, + requestById: context.userProvider.user?.clientId, + title: 'Internal Audit Checklist'.addTranslation, + initialValue: _equipmentinternalAuditModel.findings, + onSelect: (value) { + _equipmentinternalAuditModel.findings = value ?? []; }, ), 16.height, @@ -100,14 +100,17 @@ class _CreateEquipmentInternalAuditFormState extends State(context, listen: false); if (_formKey.currentState!.validate()) { _formKey.currentState!.save(); - List attachement = []; - for (var item in _deviceImages) { + _equipmentinternalAuditModel.attachments = []; + for (var item in _attachments) { String fileName = ServiceRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; - // attachement.add(WorkOrderAttachments(id: 0, name: fileName)); + _equipmentinternalAuditModel.attachments.add(InternalAuditAttachments(id: item.id, name: fileName)); } showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); + _equipmentinternalAuditModel.auditorId = context.userProvider.user?.userID; + bool status = await internalAuditProvider.addEquipmentInternalAudit(context: context, request: _equipmentinternalAuditModel); + Navigator.pop(context); + if(status){ + Navigator.pop(context); + } } } } diff --git a/lib/modules/internal_audit_module/pages/equipment_internal_audit/equipment_internal_audit_detail_page.dart b/lib/modules/internal_audit_module/pages/equipment_internal_audit/equipment_internal_audit_detail_page.dart new file mode 100644 index 00000000..465a42db --- /dev/null +++ b/lib/modules/internal_audit_module/pages/equipment_internal_audit/equipment_internal_audit_detail_page.dart @@ -0,0 +1,192 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/extensions/context_extension.dart'; +import 'package:test_sa/extensions/int_extensions.dart'; +import 'package:test_sa/extensions/string_extensions.dart'; +import 'package:test_sa/extensions/text_extensions.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; +import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; +import 'package:test_sa/modules/internal_audit_module/models/equipment_internal_audit_data_model.dart'; +import 'package:test_sa/modules/internal_audit_module/pages/update_internal_audit_page.dart'; +import 'package:test_sa/modules/internal_audit_module/provider/internal_audit_provider.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; +import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; +import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; +import 'package:test_sa/views/widgets/images/files_list.dart'; +import 'package:test_sa/views/widgets/loaders/app_loading.dart'; + +class EquipmentInternalAuditDetailPage extends StatefulWidget { + static const String id = "/details-internal-audit"; + + final int auditId; + + const EquipmentInternalAuditDetailPage({Key? key, required this.auditId}) : super(key: key); + + @override + _EquipmentInternalAuditDetailPageState createState() { + return _EquipmentInternalAuditDetailPageState(); + } +} + +class _EquipmentInternalAuditDetailPageState extends State { + bool isWoType = true; + EquipmentInternalAuditDataModel? model; + late InternalAuditProvider _internalAuditProvider; + + @override + void initState() { + super.initState(); + _internalAuditProvider = Provider.of(context, listen: false); + WidgetsBinding.instance.addPostFrameCallback((_) { + getAuditData(); + }); + } + + Future getAuditData() async { + model = await _internalAuditProvider.getEquipmentInternalAuditById(widget.auditId); + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + //TODO need to check when implementing provider needed or not . + return Scaffold( + appBar: const DefaultAppBar(title: "Request Details"), + body: Selector( + selector: (_, provider) => provider.isLoading, + builder: (_, isLoading, __) { + if (isLoading) return const ALoading(); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SingleChildScrollView( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + assetDetails(), + 8.height, + requestDetails(), + 8.height, + //TODO need to check for comments + // if (model.comment?.isNotEmpty ?? false) ...[ + const Divider().defaultStyle(context), + Text( + "Comments".addTranslation, + style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), + ), + // model.comment!.bodyText(context), + // 8.height, + // ], + //TODO need to check for attachments + // if ( _model.attachment.isNotEmpty) ...[ + const Divider().defaultStyle(context), + Text( + "Attachments".addTranslation, + style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), + ), + 8.height, + // FilesList(images: _model.attachment?.map((e) => URLs.getFileUrl(e.attachmentName ?? '') ?? '').toList() ?? []), + // ], + ], + ).paddingAll(0).toShadowContainer(context), + ).expanded, + if (context.userProvider.isEngineer) + FooterActionButton.footerContainer( + context: context, + child: AppFilledButton( + buttonColor: AppColor.primary10, + label: "Update", + onPressed: () { + Navigator.pushNamed(context, UpdateInternalAuditPage.id); + }), + ), + ], + ); + }, + )); + } + + Widget workOrderInformation() { + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Divider().defaultStyle(context), + Text( + "WO Info", + style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), + ), + 6.height, + '${context.translation.woNumber}: ${'-'}'.bodyText(context), + '${'WO Type'.addTranslation}: ${'-'}'.bodyText(context), + '${context.translation.site}: ${'-'}'.bodyText(context), + '${context.translation.assetName}: ${'-'}'.bodyText(context), + '${context.translation.manufacture}: ${'-'}'.bodyText(context), + '${context.translation.model}: ${'-'}'.bodyText(context), + ], + ); + } + + Widget requestDetails() { + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Divider().defaultStyle(context), + Text( + "Request Details", + style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), + ), + 6.height, + if (model != null && model!.equipmentsFindings != null && model!.equipmentsFindings!.isNotEmpty) + ...model!.equipmentsFindings!.map((item) { + final findingName = item.finding?.name ?? 'Unknown'; + return checklistWidget(value: findingName.addTranslation); + }).toList() + else + Text('No findings available'.addTranslation), + ], + ); + } + + Widget assetDetails() { + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Asset Details", + style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), + ), + 6.height, + '${context.translation.assetName}: ${model?.asset?.assetName ?? '-'}'.bodyText(context), + '${context.translation.assetNo}: ${model?.asset?.assetNumber ?? '-'}'.bodyText(context), + '${context.translation.manufacture}: ${model?.asset?.manufacturerName ?? '-'}'.bodyText(context), + '${context.translation.model}: ${model?.asset?.modelName ?? '-'}'.bodyText(context), + ], + ); + } + + Widget checklistWidget({required String value}) { + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + Checkbox( + value: true, + activeColor: AppColor.neutral120, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + visualDensity: const VisualDensity(horizontal: -4, vertical: -3), + onChanged: (value) {}, + ), + value.bodyText(context), + ], + ); + } +} diff --git a/lib/modules/internal_audit_module/pages/internal_audit_item_view.dart b/lib/modules/internal_audit_module/pages/equipment_internal_audit/equipment_internal_audit_item_view.dart similarity index 77% rename from lib/modules/internal_audit_module/pages/internal_audit_item_view.dart rename to lib/modules/internal_audit_module/pages/equipment_internal_audit/equipment_internal_audit_item_view.dart index 20a81aaf..4c4bbb57 100644 --- a/lib/modules/internal_audit_module/pages/internal_audit_item_view.dart +++ b/lib/modules/internal_audit_module/pages/equipment_internal_audit/equipment_internal_audit_item_view.dart @@ -1,3 +1,5 @@ +import 'dart:developer'; + import 'package:flutter/material.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; @@ -6,20 +8,21 @@ import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/all_requests_and_count_model.dart'; import 'package:test_sa/models/new_models/dashboard_detail.dart'; -import 'package:test_sa/modules/internal_audit_module/pages/internal_audit_detail_page.dart'; +import 'package:test_sa/modules/internal_audit_module/pages/equipment_internal_audit/equipment_internal_audit_detail_page.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; -class InternalAuditItemView extends StatelessWidget { +class EquipmentInternalAuditItemView extends StatelessWidget { final Data? requestData; final RequestsDetails? requestDetails; final bool showShadow; - const InternalAuditItemView({Key? key, this.requestData, this.requestDetails, this.showShadow = true}) : super(key: key); + const EquipmentInternalAuditItemView({Key? key, this.requestData, this.requestDetails, this.showShadow = true}) : super(key: key); @override Widget build(BuildContext context) { //TODO need to refactor this code repetation @waseem + log('request details ${requestDetails?.toJson()}'); if (requestData != null) { return Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -41,9 +44,8 @@ class InternalAuditItemView extends StatelessWidget { ], ), 8.height, - // (requestData?.typeTransaction ?? "Internal Audit Request").heading5(context), - ("Internal Audit Request").heading5(context), - // infoWidget(label: context.translation.requestType, value: requestData?.requestTypeName, context: context), + (requestData?.typeTransaction ?? "Internal Audit Request").heading5(context), + infoWidget(label: context.translation.assetNumber, value: requestData?.assetNumber, context: context), 8.height, Row( @@ -59,7 +61,7 @@ class InternalAuditItemView extends StatelessWidget { ), ], ).toShadowContainer(context, withShadow: showShadow).onPress(() async { - Navigator.push(context, MaterialPageRoute(builder: (context) => InternalAuditDetailPage(auditId: requestDetails!.id!))); + Navigator.push(context, MaterialPageRoute(builder: (context) => EquipmentInternalAuditDetailPage(auditId: requestDetails!.id!))); }); } return Column( @@ -82,10 +84,11 @@ class InternalAuditItemView extends StatelessWidget { ], ), 8.height, - // (requestDetails?.nameOfType ?? "Internal Audit Request").heading5(context), - ("Internal Audit Request").heading5(context), + (requestDetails?.nameOfType ?? "Internal Audit Request").heading5(context), 8.height, - // infoWidget(label: context.translation.site, value: requestDetails!.site, context: context), + infoWidget(label: context.translation.assetNumber, value: requestDetails!.assetNo, context: context), + infoWidget(label: context.translation.assetSN, value: requestDetails!.assetSN, context: context), + infoWidget(label: context.translation.model, value: requestDetails!.model, context: context), 8.height, Row( mainAxisSize: MainAxisSize.min, @@ -100,7 +103,7 @@ class InternalAuditItemView extends StatelessWidget { ), ], ).toShadowContainer(context, withShadow: showShadow).onPress(() async { - Navigator.push(context, MaterialPageRoute(builder: (context) => InternalAuditDetailPage(auditId: requestDetails!.id!))); + Navigator.push(context, MaterialPageRoute(builder: (context) => EquipmentInternalAuditDetailPage(auditId: requestDetails!.id!))); }); } diff --git a/lib/modules/internal_audit_module/pages/create_system_internal_audit_form.dart b/lib/modules/internal_audit_module/pages/system_internal_audit/create_system_internal_audit_form.dart similarity index 66% rename from lib/modules/internal_audit_module/pages/create_system_internal_audit_form.dart rename to lib/modules/internal_audit_module/pages/system_internal_audit/create_system_internal_audit_form.dart index 051e2dfd..64e8408b 100644 --- a/lib/modules/internal_audit_module/pages/create_system_internal_audit_form.dart +++ b/lib/modules/internal_audit_module/pages/system_internal_audit/create_system_internal_audit_form.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:developer'; import 'dart:io'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -13,10 +14,13 @@ import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_mo import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/modules/cm_module/utilities/service_request_utils.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; -import 'package:test_sa/modules/internal_audit_module/models/internal_audit_model.dart'; +import 'package:test_sa/modules/internal_audit_module/models/equipment_internal_audit_form_model.dart'; +import 'package:test_sa/modules/internal_audit_module/models/system_internal_audit_form_model.dart'; +import 'package:test_sa/modules/internal_audit_module/pages/system_internal_audit/system_audit_work_order_auto_complete_field.dart'; import 'package:test_sa/modules/internal_audit_module/provider/internal_audit_checklist_provider.dart'; import 'package:test_sa/modules/internal_audit_module/provider/internal_audit_finding_type_provider.dart'; import 'package:test_sa/modules/internal_audit_module/provider/internal_audit_provider.dart'; +import 'package:test_sa/modules/internal_audit_module/provider/internal_audit_wo_type_provider.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart'; @@ -25,7 +29,7 @@ import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart import 'package:test_sa/views/widgets/equipment/asset_picker.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; -import '../../../../../../new_views/common_widgets/default_app_bar.dart'; +import '../../../../../../../new_views/common_widgets/default_app_bar.dart'; class CreateSystemInternalAuditForm extends StatefulWidget { static const String id = "/create-system-audit-view"; @@ -40,22 +44,25 @@ class CreateSystemInternalAuditForm extends StatefulWidget { class _CreateSystemInternalAuditFormState extends State with TickerProviderStateMixin { late TextEditingController _commentController; late InternalAuditProvider _internalAuditProvider; - final InternalAuditModel _internalAuditModel = InternalAuditModel(); + final SystemInternalAuditFormModel _model = SystemInternalAuditFormModel(); final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); final List _deviceImages = []; + late TextEditingController _woAutoCompleteController; bool showLoading = false; @override void initState() { super.initState(); _commentController = TextEditingController(); + _woAutoCompleteController = TextEditingController(); _internalAuditProvider = Provider.of(context, listen: false); } @override void dispose() { _commentController.dispose(); + _woAutoCompleteController.dispose(); super.dispose(); } @@ -73,13 +80,31 @@ class _CreateSystemInternalAuditFormState extends State( + context: context, + height: 56.toScreenHeight, + title: 'Wo Type'.addTranslation, + showShadow: false, + backgroundColor: AppColor.fieldBgColor(context), + showAsBottomSheet: true, + initialValue: _model.workOrderType, + onSelect: (status) { + if (status != null) { + _model.workOrderType = status; + _clearWorkOrderSelection(); + _woAutoCompleteController.clear(); + setState(() {}); + } + }, + ), + 12.height, + SystemAuditWoAutoCompleteField( + woTypeId: _model.workOrderType?.value, + controller: _woAutoCompleteController, clearAfterPick: false, - byName: true, - initialValue: _internalAuditModel.woOrderNo ?? "", - onPick: (part) { - _internalAuditModel.woOrderNo = part.name; + initialValue: '', + onPick: (wo) { + updateWorkOrderReference(woTypeId: _model.workOrderType?.value, selectedId:wo.id); setState(() {}); }, ), @@ -94,10 +119,10 @@ class _CreateSystemInternalAuditFormState extends State _SystemAuditWoAutoCompleteFieldState(); +} + +class _SystemAuditWoAutoCompleteFieldState extends State { + late InternalAuditProvider _provider; + + // + // late TextEditingController _controller; + + bool loading = false; + + @override + void initState() { + // w controller = widget.controller ?? TextEditingController(text: widget.initialValue); + super.initState(); + _provider = Provider.of(context, listen: false); + } + + @override + void didUpdateWidget(covariant SystemAuditWoAutoCompleteField oldWidget) { + // if (widget.initialValue != oldWidget.initialValue) { + // // _controller = widget.controller ?? TextEditingController(text: widget.initialValue); + // } + super.didUpdateWidget(oldWidget); + } + + @override + void dispose() { + if (widget.controller == null) { + // _controller.dispose(); + } + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final border = UnderlineInputBorder(borderSide: BorderSide.none, borderRadius: BorderRadius.circular(10)); + return Container( + decoration: BoxDecoration( + color: AppColor.background(context), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + // boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)], + ), + child: Autocomplete( + optionsBuilder: (TextEditingValue textEditingValue) async { + if (textEditingValue.text.isEmpty) { + if (loading) { + setState(() { + loading = false; + }); + } + return const Iterable.empty(); + } + if (!loading) { + setState(() { + loading = true; + }); + } + List workOrders = (await _provider.getWorkOrderByWoType(text: textEditingValue.text, woId:widget.woTypeId)); + setState(() { + loading = false; + }); + return workOrders; + }, + displayStringForOption: (WoAutoCompleteModel option) => option.displayName ?? '', + fieldViewBuilder: (BuildContext context, TextEditingController fieldTextEditingController, FocusNode fieldFocusNode, VoidCallback onFieldSubmitted) { + return TextField( + controller: widget.controller, + focusNode: fieldFocusNode, + style: AppTextStyles.bodyText.copyWith(color: AppColor.black10), + textAlign: TextAlign.start, + decoration: InputDecoration( + border: border, + disabledBorder: border, + focusedBorder: border, + enabledBorder: border, + errorBorder: border, + contentPadding: EdgeInsets.symmetric(vertical: 8.toScreenHeight, horizontal: 16.toScreenWidth), + constraints: const BoxConstraints(), + suffixIconConstraints: const BoxConstraints(maxHeight: 24, maxWidth: 24 + 8), + filled: true, + fillColor: AppColor.fieldBgColor(context), + errorStyle: AppTextStyle.tiny.copyWith(color: context.isDark ? AppColor.red50 : AppColor.red60), + floatingLabelStyle: AppTextStyle.body1.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? null : AppColor.neutral20), + labelText: context.translation.woNumber, + labelStyle: AppTextStyles.tinyFont.copyWith(color: AppColor.textColor(context)), + suffixIcon: loading ? const CircularProgressIndicator(color: AppColor.primary10, strokeWidth: 3.0).paddingOnly(end: 8) : null, + ), + textInputAction: TextInputAction.search, + onChanged: (text) { + fieldTextEditingController.text = text; + }, + onSubmitted: (String value) { + onFieldSubmitted(); + }, + ); + }, + onSelected: (WoAutoCompleteModel selection) { + if (widget.clearAfterPick) { + widget.controller.clear(); + } else { + widget.controller.text = (selection.displayName ?? ""); + } + widget.onPick(selection); + }, + ), + ); + } + + // String getUrl(int? woTypeId) { + // if (woTypeId == null) return ''; + // String base = URLs.woAutoCompleteBase; + // var urlMap = { + // 1: '$base/ServiceRequest/WorkOrderAutoComplete', // CM + // 2: '$base/GasRefill/GetGasRefillAutoComplete', // Gas Refill + // 3: '$base/AssetTransfer/GetAssetTransferAutoComplete', // Asset Transfer + // 4: '$base/PlanPreventiveVisit/GetAutoCompletePlanPreventiveVisit', // PPM Request + // 5: '$base/PlanRecurrentTasks/GetPlanRecurrentTask', // Recurrent WO + // 6: '$base/TaskJobs/AutocompleteTaskJob', // Task + // 7: '$base/TaskJobs/AutocompleteTaskJob', // Recall & Alert + // }; + // return urlMap[woTypeId] ?? ''; + // } +} diff --git a/lib/modules/internal_audit_module/pages/internal_audit_detail_page.dart b/lib/modules/internal_audit_module/pages/system_internal_audit/system_internal_audit_detail_page.dart similarity index 94% rename from lib/modules/internal_audit_module/pages/internal_audit_detail_page.dart rename to lib/modules/internal_audit_module/pages/system_internal_audit/system_internal_audit_detail_page.dart index dd36f431..a4f459fe 100644 --- a/lib/modules/internal_audit_module/pages/internal_audit_detail_page.dart +++ b/lib/modules/internal_audit_module/pages/system_internal_audit/system_internal_audit_detail_page.dart @@ -16,20 +16,19 @@ import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/views/widgets/images/files_list.dart'; import 'package:test_sa/views/widgets/loaders/app_loading.dart'; -class InternalAuditDetailPage extends StatefulWidget { - static const String id = "/details-internal-audit"; - +class SystemInternalAuditDetailPage extends StatefulWidget { + static const String id = "/details-system-internal-audit"; final int auditId; - InternalAuditDetailPage({Key? key, required this.auditId}) : super(key: key); + SystemInternalAuditDetailPage({Key? key, required this.auditId}) : super(key: key); @override - _InternalAuditDetailPageState createState() { - return _InternalAuditDetailPageState(); + _SystemInternalAuditDetailPageState createState() { + return _SystemInternalAuditDetailPageState(); } } -class _InternalAuditDetailPageState extends State { +class _SystemInternalAuditDetailPageState extends State { bool isWoType = true; @override diff --git a/lib/modules/internal_audit_module/pages/system_internal_audit/system_internal_audit_item_view.dart b/lib/modules/internal_audit_module/pages/system_internal_audit/system_internal_audit_item_view.dart new file mode 100644 index 00000000..db6e2c11 --- /dev/null +++ b/lib/modules/internal_audit_module/pages/system_internal_audit/system_internal_audit_item_view.dart @@ -0,0 +1,118 @@ +import 'dart:developer'; + +import 'package:flutter/material.dart'; +import 'package:test_sa/extensions/context_extension.dart'; +import 'package:test_sa/extensions/int_extensions.dart'; +import 'package:test_sa/extensions/string_extensions.dart'; +import 'package:test_sa/extensions/text_extensions.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; +import 'package:test_sa/models/all_requests_and_count_model.dart'; +import 'package:test_sa/models/new_models/dashboard_detail.dart'; +import 'package:test_sa/modules/internal_audit_module/pages/equipment_internal_audit/equipment_internal_audit_detail_page.dart'; +import 'package:test_sa/modules/internal_audit_module/pages/system_internal_audit/system_internal_audit_detail_page.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; +import 'package:test_sa/views/widgets/requests/request_status.dart'; + +class SystemInternalAuditItemView extends StatelessWidget { + final Data? requestData; + final RequestsDetails? requestDetails; + final bool showShadow; + + const SystemInternalAuditItemView({Key? key, this.requestData, this.requestDetails, this.showShadow = true}) : super(key: key); + + @override + Widget build(BuildContext context) { + //TODO need to refactor this code repetation @waseem + log('request details ${requestDetails?.toJson()}'); + if (requestData != null) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + StatusLabel( + label: requestData!.statusName!, + textColor: AppColor.getRequestStatusTextColorByName(context, requestData!.statusName!), + backgroundColor: AppColor.getRequestStatusColorByName(context, requestData!.statusName!), + ), + 1.width.expanded, + Text( + requestData!.transactionDate?.toServiceRequestCardFormat ?? "", + textAlign: TextAlign.end, + style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50), + ), + ], + ), + 8.height, + (requestData?.typeTransaction ?? "Internal Audit Request").heading5(context), + infoWidget(label: context.translation.assetNo, value: requestData?.assetNumber, context: context), + + 8.height, + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + context.translation.viewDetails, + style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context)), + ), + 4.width, + Icon(Icons.arrow_forward, color: AppColor.blueStatus(context), size: 14) + ], + ), + ], + ).toShadowContainer(context, withShadow: showShadow).onPress(() async { + Navigator.push(context, MaterialPageRoute(builder: (context) => SystemInternalAuditDetailPage(auditId: requestDetails!.id!))); + }); + } + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + StatusLabel( + label: requestDetails!.status!, + textColor: AppColor.getRequestStatusTextColorByName(context, requestDetails?.status!), + backgroundColor: AppColor.getRequestStatusColorByName(context, requestDetails?.status!), + ), + 1.width.expanded, + Text( + requestDetails!.date?.toServiceRequestCardFormat ?? "", + textAlign: TextAlign.end, + style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50), + ), + ], + ), + 8.height, + (requestDetails?.nameOfType ?? "Internal Audit Request").heading5(context), + infoWidget(label: context.translation.assetNumber, value: requestDetails!.assetNo, context: context), + infoWidget(label: context.translation.assetSN, value: requestDetails!.assetSN, context: context), + infoWidget(label: context.translation.model, value: requestDetails!.model, context: context), + 8.height, + // infoWidget(label: context.translation.site, value: requestDetails!.site, context: context), + 8.height, + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + context.translation.viewDetails, + style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context)), + ), + 4.width, + Icon(Icons.arrow_forward, color: AppColor.blueStatus(context), size: 14) + ], + ), + ], + ).toShadowContainer(context, withShadow: showShadow).onPress(() async { + Navigator.push(context, MaterialPageRoute(builder: (context) => SystemInternalAuditDetailPage(auditId: requestDetails!.id!))); + }); + } + + Widget infoWidget({required String label, String? value, required BuildContext context}) { + if (value != null && value.isNotEmpty) { + return '$label: $value'.bodyText(context); + } + return const SizedBox(); + } +} diff --git a/lib/modules/internal_audit_module/provider/internal_audit_checklist_provider.dart b/lib/modules/internal_audit_module/provider/internal_audit_checklist_provider.dart index 3240bf2d..e4454551 100644 --- a/lib/modules/internal_audit_module/provider/internal_audit_checklist_provider.dart +++ b/lib/modules/internal_audit_module/provider/internal_audit_checklist_provider.dart @@ -15,7 +15,7 @@ class InternalAuditCheckListProvider extends LoadingListNotifier { notifyListeners(); Response response; try { - response = await ApiManager.instance.get(URLs.getPentryTaskStatus); + response = await ApiManager.instance.get(URLs.getInternalAuditChecklist); } catch (error) { loading = false; stateCode = -1; diff --git a/lib/modules/internal_audit_module/provider/internal_audit_finding_type_provider.dart b/lib/modules/internal_audit_module/provider/internal_audit_finding_type_provider.dart index c9ee41a8..9371cb1d 100644 --- a/lib/modules/internal_audit_module/provider/internal_audit_finding_type_provider.dart +++ b/lib/modules/internal_audit_module/provider/internal_audit_finding_type_provider.dart @@ -14,7 +14,7 @@ class InternalAuditFindingTypeProvider extends LoadingListNotifier { notifyListeners(); Response response; try { - response = await ApiManager.instance.get(URLs.getPentryTaskStatus); + response = await ApiManager.instance.get(URLs.getInternalAuditFindingType); } catch (error) { loading = false; stateCode = -1; diff --git a/lib/modules/internal_audit_module/provider/internal_audit_provider.dart b/lib/modules/internal_audit_module/provider/internal_audit_provider.dart index 983bd6ca..6f2a9b9d 100644 --- a/lib/modules/internal_audit_module/provider/internal_audit_provider.dart +++ b/lib/modules/internal_audit_module/provider/internal_audit_provider.dart @@ -2,34 +2,66 @@ import 'dart:convert'; import 'dart:developer'; import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.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/extensions/context_extension.dart'; import 'package:test_sa/models/device/asset_search.dart'; import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/new_models/asset_nd_auto_complete_by_dynamic_codes_model.dart'; +import 'package:test_sa/modules/internal_audit_module/models/equipment_internal_audit_data_model.dart'; +import 'package:test_sa/modules/internal_audit_module/models/equipment_internal_audit_form_model.dart'; +import 'package:test_sa/modules/internal_audit_module/models/system_internal_audit_form_model.dart'; +import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart'; class InternalAuditProvider extends ChangeNotifier { final pageItemNumber = 10; final searchPageItemNumber = 10; int pageNo = 1; + void reset() { pageNo = 1; stateCode = null; } + int? stateCode; bool isDetailLoading = false; bool nextPage = false; bool isNextPageLoading = false; bool isLoading = false; - Future getInternalAuditById(int id) async { + + Future getEquipmentInternalAuditById(int id) async { try { isLoading = true; notifyListeners(); - //Need to replace - Response response = await ApiManager.instance.get("${URLs.getTRAFById}?id=$id"); + Response response = await ApiManager.instance.get( + "${URLs.getInternalAuditEquipmentById}?internalAuditEquipmentId=$id", + ); if (response.statusCode >= 200 && response.statusCode < 300) { - // trafRequestDataModel = TrafRequestDataModel.fromJson(json.decode(response.body)["data"]); + final decodedBody = jsonDecode(response.body); + EquipmentInternalAuditDataModel model = EquipmentInternalAuditDataModel.fromJson(decodedBody["data"]); + isLoading = false; + notifyListeners(); + return model; + } else { + isLoading = false; + notifyListeners(); + return null; } + } catch (error) { + isLoading = false; + notifyListeners(); + return null; + } + } + + Future getInternalSystemAuditById(int id) async { + try { + isLoading = true; + notifyListeners(); + Response response = await ApiManager.instance.get("${URLs.getInternalAuditSystemById}?AuditSystemId=$id"); + if (response.statusCode >= 200 && response.statusCode < 300) {} isLoading = false; notifyListeners(); return 0; @@ -39,4 +71,44 @@ class InternalAuditProvider extends ChangeNotifier { return -1; } } + + Future addEquipmentInternalAudit({ + required BuildContext context, + required EquipmentInternalAuditFormModel request, + }) async { + bool status = false; + Response response; + try { + response = await ApiManager.instance.post(URLs.addOrUpdateEquipmentInternalAudit, body: request.toJson()); + if (response.statusCode >= 200 && response.statusCode < 300) { + status = true; + notifyListeners(); + } else { + Fluttertoast.showToast(msg: "${context.translation.failedRequestMessage} :${json.decode(response.body)['message']}"); + status = false; + } + return status; + } catch (error) { + print(error); + status = false; + notifyListeners(); + return status; + } + } + + Future> getWorkOrderByWoType({String? text, required int? woId}) async { + late Response response; + try { + Response response = await ApiManager.instance.get("${URLs.getWoAutoComplete}?workOrderTypeId=$woId&search=$text"); + // response = await ApiManager.instance.post(url, body: {"search": text}); + List woOrderList = []; + if (response.statusCode >= 200 && response.statusCode < 300) { + List categoriesListJson = json.decode(response.body)["data"]; + woOrderList = categoriesListJson.map((wo) => WoAutoCompleteModel.fromJson(wo)).toList(); + } + return woOrderList; + } catch (error) { + return []; + } + } } diff --git a/lib/modules/internal_audit_module/provider/internal_audit_wo_type_provider.dart b/lib/modules/internal_audit_module/provider/internal_audit_wo_type_provider.dart new file mode 100644 index 00000000..7c7b4e5e --- /dev/null +++ b/lib/modules/internal_audit_module/provider/internal_audit_wo_type_provider.dart @@ -0,0 +1,35 @@ + +import 'dart:convert'; + +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/providers/loading_list_notifier.dart'; + +class InternalAuditWoTypeProvider extends LoadingListNotifier { + @override + Future getData({int? id}) async { + if (loading ?? false) return -2; + loading = true; + notifyListeners(); + Response response; + try { + response = await ApiManager.instance.get(URLs.getInternalAuditWoType); + } catch (error) { + loading = false; + stateCode = -1; + notifyListeners(); + return -1; + } + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + List listJson = json.decode(response.body)["data"]; + items = listJson.map((department) => Lookup.fromJson(department)).toList(); + } + loading = false; + notifyListeners(); + return response.statusCode; + } +} + diff --git a/lib/new_views/pages/land_page/create_request-type_bottomsheet.dart b/lib/new_views/pages/land_page/create_request-type_bottomsheet.dart index 1988336f..c88e576d 100644 --- a/lib/new_views/pages/land_page/create_request-type_bottomsheet.dart +++ b/lib/new_views/pages/land_page/create_request-type_bottomsheet.dart @@ -9,8 +9,8 @@ import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/modules/cm_module/views/nurse/create_new_request_view.dart'; -import 'package:test_sa/modules/internal_audit_module/pages/create_equipment_internal_audit_form.dart'; -import 'package:test_sa/modules/internal_audit_module/pages/create_system_internal_audit_form.dart'; +import 'package:test_sa/modules/internal_audit_module/pages/equipment_internal_audit/create_equipment_internal_audit_form.dart'; +import 'package:test_sa/modules/internal_audit_module/pages/system_internal_audit/create_system_internal_audit_form.dart'; import 'package:test_sa/modules/tm_module/tasks_wo/create_task_view.dart'; import 'package:test_sa/modules/traf_module/create_traf_request_page.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; diff --git a/lib/new_views/pages/land_page/my_request/my_requests_page.dart b/lib/new_views/pages/land_page/my_request/my_requests_page.dart index 30f86273..2f7bf6d0 100644 --- a/lib/new_views/pages/land_page/my_request/my_requests_page.dart +++ b/lib/new_views/pages/land_page/my_request/my_requests_page.dart @@ -58,9 +58,9 @@ class _MyRequestsPageState extends State { requestsList.add(Request(9, 'TRAF')); } if (context.userProvider.isEngineer) { - //TODO need to replace with actual number. - // requestsList.add(Request(10, 'Internal Audit')); - requestsList.add(Request(1, 'Internal Audit')); + // TODO need to replace with actual number. + requestsList.add(Request(10, 'Equipment Internal Audit')); + requestsList.add(Request(11, 'System Internal Audit')); } if (context.userProvider.isAssessor) { @@ -73,9 +73,8 @@ class _MyRequestsPageState extends State { requestsList = [ Request(null, context.translation.allWorkOrder), //TODO need to replace with actual number. - - // Request(10, 'Internal Audit'), - Request(1, 'Internal Audit'), + Request(10, 'Equipment Internal Audit'), + Request(11, 'System Internal Audit'), ]; } diff --git a/lib/new_views/pages/land_page/requests/request_paginated_listview.dart b/lib/new_views/pages/land_page/requests/request_paginated_listview.dart index 7b172e50..97e9bf58 100644 --- a/lib/new_views/pages/land_page/requests/request_paginated_listview.dart +++ b/lib/new_views/pages/land_page/requests/request_paginated_listview.dart @@ -1,7 +1,8 @@ import 'package:flutter/material.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/models/new_models/dashboard_detail.dart'; -import 'package:test_sa/modules/internal_audit_module/pages/internal_audit_item_view.dart'; +import 'package:test_sa/modules/internal_audit_module/pages/equipment_internal_audit/equipment_internal_audit_item_view.dart'; +import 'package:test_sa/modules/internal_audit_module/pages/system_internal_audit/system_internal_audit_item_view.dart'; import 'package:test_sa/modules/tm_module/tasks_wo/task_request_item_view.dart'; import 'package:test_sa/modules/traf_module/traf_request_item_view.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; @@ -55,7 +56,8 @@ class RequestPaginatedListview extends StatelessWidget { bool isRecurrentTask = request.transactionNo == 5; bool isTask = request.transactionNo == 6; bool isTRAF = request.transactionNo == 9; - bool isInternalAudit = request.transactionNo == 10; + bool isEquipmentInternalAudit = request.transactionNo == 10; + bool isSystemInternalAudit = request.transactionNo == 11; if (isServiceRequest) { return ServiceRequestItemView(requestData: request, refreshData: false); @@ -69,14 +71,13 @@ class RequestPaginatedListview extends StatelessWidget { return RecurrentWoItemView(requestData: request); } else if (isTask) { return TaskRequestItemView(requestData: request); - } - else if (isTRAF) { + } else if (isTRAF) { return TrafRequestItemView(requestData: request); - } - else if (isInternalAudit) { - return InternalAuditItemView(requestData: request); - } - else { + } else if (isEquipmentInternalAudit) { + return EquipmentInternalAuditItemView(requestData: request); + } else if (isSystemInternalAudit) { + return SystemInternalAuditItemView(requestData: request); + } else { return Container( height: 100, width: double.infinity, diff --git a/lib/new_views/pages/land_page/widgets/request_item_view_list.dart b/lib/new_views/pages/land_page/widgets/request_item_view_list.dart index 08b1f51a..ec9b9d31 100644 --- a/lib/new_views/pages/land_page/widgets/request_item_view_list.dart +++ b/lib/new_views/pages/land_page/widgets/request_item_view_list.dart @@ -1,12 +1,16 @@ //request tab page +import 'dart:developer'; + import 'package:flutter/material.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/all_requests_and_count_model.dart'; -import 'package:test_sa/modules/internal_audit_module/pages/internal_audit_item_view.dart'; +import 'package:test_sa/modules/internal_audit_module/pages/equipment_internal_audit/equipment_internal_audit_item_view.dart'; +import 'package:test_sa/modules/internal_audit_module/pages/system_internal_audit/system_internal_audit_item_view.dart'; import 'package:test_sa/modules/tm_module/tasks_wo/task_request_item_view.dart'; import 'package:test_sa/modules/traf_module/traf_request_item_view.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/pages/land_page/requests/device_item_view.dart'; import 'package:test_sa/new_views/pages/land_page/requests/gas_refill_item_view.dart'; import 'package:test_sa/new_views/pages/land_page/requests/ppm_item_view.dart'; @@ -29,11 +33,19 @@ class RequestItemViewList extends StatelessWidget { shrinkWrap: true, itemBuilder: (cxt, index) { if (isLoading) return const SizedBox().toRequestShimmer(cxt, isLoading); + if (list[index].transactionType == null) { + return EquipmentInternalAuditItemView(requestDetails: list[index]); + // return Container( + // height: 100, + // width: double.infinity, + // color: AppColor.neutral40, + // ); + } switch (list[index].transactionType) { - // case 1: - // return ServiceRequestItemView(requestDetails: list[index]); case 1: - return InternalAuditItemView(requestDetails: list[index]); + return ServiceRequestItemView(requestDetails: list[index]); + // case 1: + // return InternalAuditItemView(requestDetails: list[index]); case 2: return GasRefillItemView(requestDetails: list[index]); case 3: @@ -48,9 +60,11 @@ class RequestItemViewList extends StatelessWidget { return TaskRequestItemView(requestDetails: list[index]); case 9: return TrafRequestItemView(requestDetails: list[index]); - //Need to verify the type No.. - case 10: - return InternalAuditItemView(requestDetails: list[index]); + //Need to verify the type No.. + case 10: + return EquipmentInternalAuditItemView(requestDetails: list[index]); + case 11: + return SystemInternalAuditItemView(requestDetails: list[index]); default: Container( height: 100,