internal audit api's implementation in progress

design_3.0_internal_audit_module
WaseemAbbasi22 2 months ago
parent 09843a9625
commit a8e8774040

@ -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";
}

@ -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;
}

@ -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,

@ -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()),

@ -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<EquipmentsFinding>? equipmentsFindings;
List<dynamic>? 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<String, dynamic> 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 = <EquipmentsFinding>[];
json['equipmentsFindings'].forEach((v) {
equipmentsFindings!.add(EquipmentsFinding.fromJson(v));
});
}
attachments = json['attachments'] != null ? List<dynamic>.from(json['attachments']) : [];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> 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<String, dynamic> 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<String, dynamic> toJson() {
final Map<String, dynamic> 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<String, dynamic> json) {
id = json['id'];
name = json['name'];
value = json['value'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> 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<String, dynamic> 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<String, dynamic> toJson() {
final Map<String, dynamic> 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<String, dynamic> 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<String, dynamic> toJson() {
final Map<String, dynamic> 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<String, dynamic> json) {
id = json['id'];
finding = json['finding'] != null ? Finding.fromJson(json['finding']) : null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> 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<String, dynamic> json) {
id = json['id'];
name = json['name'];
value = json['value'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = {};
data['id'] = id;
data['name'] = name;
data['value'] = value;
return data;
}
}

@ -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<String>? devicePhotos;
List<Lookup> findings =[];
List<InternalAuditAttachments> attachments = [];
String? remarks;
Asset? device;
EquipmentInternalAuditFormModel({
this.id,
this.deviceArName,
this.auditorId,
this.devicePhotos,
this.woOrderNo,
this.remarks,
});
Map<String, dynamic> 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,
};
}
}

@ -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<String, dynamic> json) {
id = json['id'];
name = json['name'];
originalName = json['originalName'];
createdBy = json['createdBy'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
// data['id'] = id;
data['name'] = name;
data['originalName'] = originalName;
// data['createdBy'] = createdBy;
return data;
}
}

@ -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<String>? devicePhotos;
Lookup? auditCheckList;
String? comments;
Asset? device;
InternalAuditModel({
this.id,
this.deviceArName,
this.devicePhotos,
this.deviceId,
this.woOrderNo,
this.comments,
});
}

@ -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<String, dynamic> 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<String, dynamic> json) {
id = json['id'];
workOrderNo = json['workOrderNo'];
displayName = json['workOrderNo'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] =id;
data['woOrderNo'] = workOrderNo;
data['displayName'] = workOrderNo;
return data;
}
}

@ -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<CreateEquipmentInternalAuditForm> with TickerProviderStateMixin {
late TextEditingController _commentController;
final InternalAuditModel _internalAuditModel = InternalAuditModel();
final List<GenericAttachmentModel> _deviceImages = [];
final EquipmentInternalAuditFormModel _equipmentinternalAuditModel = EquipmentInternalAuditFormModel();
final List<GenericAttachmentModel> _attachments = [];
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
FocusNode auditCheckListNode = FocusNode();
@override
void initState() {
@ -68,28 +69,27 @@ class _CreateEquipmentInternalAuditFormState extends State<CreateEquipmentIntern
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AssetPicker(
device: _internalAuditModel.device,
device: _equipmentinternalAuditModel.device,
borderColor: AppColor.black20,
buttonColor: AppColor.white936,
onPick: (asset) async {
_internalAuditModel.device = asset;
_equipmentinternalAuditModel.device = asset;
setState(() {});
},
),
16.height,
SingleItemDropDownMenu<Lookup, InternalAuditCheckListProvider>(
//TODO need to check layout issue...
MultipleItemDropDownMenu<Lookup, InternalAuditCheckListProvider>(
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<CreateEquipmentIntern
alignLabelWithHint: true,
textInputType: TextInputType.multiline,
showShadow: false,
onSaved: (text) {},
onSaved: (value) {
_equipmentinternalAuditModel.remarks = value;
},
),
16.height,
AttachmentPicker(
label: context.translation.attachments,
attachment: _deviceImages,
attachment: _attachments,
buttonColor: AppColor.primary10,
onlyImages: false,
onChange: (value) {},
buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10),
),
],
@ -127,12 +130,18 @@ class _CreateEquipmentInternalAuditFormState extends State<CreateEquipmentIntern
InternalAuditProvider internalAuditProvider = Provider.of<InternalAuditProvider>(context, listen: false);
if (_formKey.currentState!.validate()) {
_formKey.currentState!.save();
List<WorkOrderAttachments> 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);
}
}
}
}

@ -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<EquipmentInternalAuditDetailPage> {
bool isWoType = true;
EquipmentInternalAuditDataModel? model;
late InternalAuditProvider _internalAuditProvider;
@override
void initState() {
super.initState();
_internalAuditProvider = Provider.of<InternalAuditProvider>(context, listen: false);
WidgetsBinding.instance.addPostFrameCallback((_) {
getAuditData();
});
}
Future<void> 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<InternalAuditProvider, bool>(
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),
],
);
}
}

@ -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!)));
});
}

@ -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<CreateSystemInternalAuditForm> with TickerProviderStateMixin {
late TextEditingController _commentController;
late InternalAuditProvider _internalAuditProvider;
final InternalAuditModel _internalAuditModel = InternalAuditModel();
final SystemInternalAuditFormModel _model = SystemInternalAuditFormModel();
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
final List<GenericAttachmentModel> _deviceImages = [];
late TextEditingController _woAutoCompleteController;
bool showLoading = false;
@override
void initState() {
super.initState();
_commentController = TextEditingController();
_woAutoCompleteController = TextEditingController();
_internalAuditProvider = Provider.of<InternalAuditProvider>(context, listen: false);
}
@override
void dispose() {
_commentController.dispose();
_woAutoCompleteController.dispose();
super.dispose();
}
@ -73,13 +80,31 @@ class _CreateSystemInternalAuditFormState extends State<CreateSystemInternalAudi
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AutoCompletePartsField(
assetId: 0,
SingleItemDropDownMenu<Lookup, InternalAuditWoTypeProvider>(
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<CreateSystemInternalAudi
showShadow: false,
backgroundColor: AppColor.fieldBgColor(context),
showAsBottomSheet: true,
initialValue: _internalAuditModel.auditCheckList,
initialValue: _model.findingType,
onSelect: (status) {
if (status != null) {
_internalAuditModel.auditCheckList = status;
_model.findingType = status;
setState(() {});
}
},
@ -110,16 +135,19 @@ class _CreateSystemInternalAuditFormState extends State<CreateSystemInternalAudi
alignLabelWithHint: true,
textInputType: TextInputType.multiline,
showShadow: false,
onSaved: (text) {},
),
16.height,
AttachmentPicker(
label: context.translation.attachments,
attachment: _deviceImages,
buttonColor: AppColor.primary10,
onlyImages: false,
buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10),
onSaved: (value) {
_model.findingDescription = value;
},
),
//TODO Not Avaliable in CR and API
// 16.height,
// AttachmentPicker(
// label: context.translation.attachments,
// attachment: _deviceImages,
// buttonColor: AppColor.primary10,
// onlyImages: false,
// buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.primary10),
// ),
],
).toShadowContainer(context),
).expanded,
@ -193,4 +221,43 @@ class _CreateSystemInternalAuditFormState extends State<CreateSystemInternalAudi
),
);
}
void updateWorkOrderReference({int? woTypeId, int? selectedId}) {
_clearWorkOrderSelection();
if (woTypeId == null || selectedId == null) return;
switch (woTypeId) {
case 1: // CM
_model.correctiveMaintenanceId = selectedId;
break;
case 2: // Gas Refill
_model.gasRefillId = selectedId;
break;
case 3: // Asset Transfer
_model.assetTransferId = selectedId;
break;
case 4: // PPM Request
_model.planPreventiveVisitId = selectedId;
break;
case 5: // Recurrent WO
_model.planRecurrentTaskId = selectedId;
break;
case 6: // Task
_model.taskJobId = selectedId;
break;
case 7: // Recall & Alert
_model.taskAlertJobId = selectedId;
break;
}
}
void _clearWorkOrderSelection() {
_model.correctiveMaintenanceId = null;
_model.planPreventiveVisitId = null;
_model.assetTransferId = null;
_model.taskJobId = null;
_model.taskAlertJobId = null;
_model.gasRefillId = null;
_model.planRecurrentTaskId = null;
}
}

@ -0,0 +1,149 @@
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/modules/internal_audit_module/models/system_internal_audit_form_model.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/app_style/app_text_style.dart';
import 'package:test_sa/views/app_style/sizing.dart';
class SystemAuditWoAutoCompleteField extends StatefulWidget {
final String initialValue;
final int? woTypeId;
final TextEditingController controller;
final bool clearAfterPick;
final Function(WoAutoCompleteModel) onPick;
const SystemAuditWoAutoCompleteField({Key? key, required this.initialValue, this.woTypeId, required this.onPick, this.clearAfterPick = true, required this.controller}) : super(key: key);
@override
_SystemAuditWoAutoCompleteFieldState createState() => _SystemAuditWoAutoCompleteFieldState();
}
class _SystemAuditWoAutoCompleteFieldState extends State<SystemAuditWoAutoCompleteField> {
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<InternalAuditProvider>(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<WoAutoCompleteModel>(
optionsBuilder: (TextEditingValue textEditingValue) async {
if (textEditingValue.text.isEmpty) {
if (loading) {
setState(() {
loading = false;
});
}
return const Iterable<WoAutoCompleteModel>.empty();
}
if (!loading) {
setState(() {
loading = true;
});
}
List<WoAutoCompleteModel> 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] ?? '';
// }
}

@ -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<InternalAuditDetailPage> {
class _SystemInternalAuditDetailPageState extends State<SystemInternalAuditDetailPage> {
bool isWoType = true;
@override

@ -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();
}
}

@ -15,7 +15,7 @@ class InternalAuditCheckListProvider extends LoadingListNotifier<Lookup> {
notifyListeners();
Response response;
try {
response = await ApiManager.instance.get(URLs.getPentryTaskStatus);
response = await ApiManager.instance.get(URLs.getInternalAuditChecklist);
} catch (error) {
loading = false;
stateCode = -1;

@ -14,7 +14,7 @@ class InternalAuditFindingTypeProvider extends LoadingListNotifier<Lookup> {
notifyListeners();
Response response;
try {
response = await ApiManager.instance.get(URLs.getPentryTaskStatus);
response = await ApiManager.instance.get(URLs.getInternalAuditFindingType);
} catch (error) {
loading = false;
stateCode = -1;

@ -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<int> getInternalAuditById(int id) async {
Future<EquipmentInternalAuditDataModel?> 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<int> 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<bool> 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<List<WoAutoCompleteModel>> 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<WoAutoCompleteModel> 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 [];
}
}
}

@ -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<Lookup> {
@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;
}
}

@ -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';

@ -58,9 +58,9 @@ class _MyRequestsPageState extends State<MyRequestsPage> {
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<MyRequestsPage> {
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'),
];
}

@ -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,

@ -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,

Loading…
Cancel
Save