Merge branch 'development_sultan' of https://gitlab.com/mirza.shafique/mohem_flutter_app into Fatima
Conflicts: lib/api/profile_api_client.dartmerge-requests/1/merge
commit
17ca565f4c
@ -0,0 +1,136 @@
|
|||||||
|
import 'package:mohem_flutter_app/api/api_client.dart';
|
||||||
|
import 'package:mohem_flutter_app/app_state/app_state.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/consts.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/generic_response_model.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/mowadhafhi/get_department_sections.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/mowadhafhi/get_project_departments.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/mowadhafhi/get_projects.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/mowadhafhi/get_section_topics.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_details.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_transactions.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_types.dart';
|
||||||
|
|
||||||
|
import '../../models/mowadhafhi/get_tickets_list.dart';
|
||||||
|
|
||||||
|
class MowadhafhiApiClient {
|
||||||
|
static final MowadhafhiApiClient _instance = MowadhafhiApiClient._internal();
|
||||||
|
|
||||||
|
MowadhafhiApiClient._internal();
|
||||||
|
|
||||||
|
factory MowadhafhiApiClient() => _instance;
|
||||||
|
|
||||||
|
Future<List<GetTicketsByEmployeeList>> getTicketsByEmployee() async {
|
||||||
|
String url = "${ApiConsts.cocRest}Mohemm_ITG_GetTicketsByEmployee";
|
||||||
|
Map<String, dynamic> postParams = {"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER, "ItgPageSize": 10, "ItgPageNo": 1};
|
||||||
|
|
||||||
|
postParams.addAll(AppState().postParamsJson);
|
||||||
|
return await ApiClient().postJsonForObject((json) {
|
||||||
|
GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
|
||||||
|
return responseData.getTicketsByEmployeeList ?? [];
|
||||||
|
}, url, postParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<List<GetTicketDetailsByEmployee>> getTicketDetailsByEmployee(String? itgTicketID) async {
|
||||||
|
String url = "${ApiConsts.cocRest}Mohemm_ITG_GetTicketDetails";
|
||||||
|
Map<String, dynamic> postParams = {"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER, "ItgTicketId": itgTicketID};
|
||||||
|
|
||||||
|
postParams.addAll(AppState().postParamsJson);
|
||||||
|
return await ApiClient().postJsonForObject((json) {
|
||||||
|
GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
|
||||||
|
return responseData.getTicketDetailsByEmployee ?? [];
|
||||||
|
}, url, postParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<List<GetTicketTransactions>> getTicketTransactions(String? itgTicketID) async {
|
||||||
|
String url = "${ApiConsts.cocRest}Mohemm_ITG_GetTicketTransaction";
|
||||||
|
Map<String, dynamic> postParams = {"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER, "ItgTicketId": itgTicketID};
|
||||||
|
|
||||||
|
postParams.addAll(AppState().postParamsJson);
|
||||||
|
return await ApiClient().postJsonForObject((json) {
|
||||||
|
GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
|
||||||
|
return responseData.getTicketTransactions ?? [];
|
||||||
|
}, url, postParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<List<GetTicketTypes>> getTicketTypes() async {
|
||||||
|
String url = "${ApiConsts.cocRest}Mohemm_ITG_GetTicketTypes";
|
||||||
|
Map<String, dynamic> postParams = {"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER};
|
||||||
|
|
||||||
|
postParams.addAll(AppState().postParamsJson);
|
||||||
|
return await ApiClient().postJsonForObject((json) {
|
||||||
|
GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
|
||||||
|
return responseData.getTicketTypes ?? [];
|
||||||
|
}, url, postParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<List<GetMowadhafhiProjects>> getProjects() async {
|
||||||
|
String url = "${ApiConsts.cocRest}Mohemm_ITG_GetProjects";
|
||||||
|
Map<String, dynamic> postParams = {"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER, "ItgProjectCode": AppState().memberInformationList?.pAYROLLCODE};
|
||||||
|
|
||||||
|
postParams.addAll(AppState().postParamsJson);
|
||||||
|
return await ApiClient().postJsonForObject((json) {
|
||||||
|
GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
|
||||||
|
return responseData.getMowadhafhiProjects ?? [];
|
||||||
|
}, url, postParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<List<GetProjectDepartments>> getProjectDepartments(int projectID) async {
|
||||||
|
String url = "${ApiConsts.cocRest}Mohemm_ITG_GetProjectDepartments";
|
||||||
|
Map<String, dynamic> postParams = {"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER, "ItgProjectId": projectID};
|
||||||
|
|
||||||
|
postParams.addAll(AppState().postParamsJson);
|
||||||
|
return await ApiClient().postJsonForObject((json) {
|
||||||
|
GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
|
||||||
|
return responseData.getProjectDepartments ?? [];
|
||||||
|
}, url, postParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<List<GetDepartmentSections>> getDepartmentSections(int? projectDepartmentID) async {
|
||||||
|
String url = "${ApiConsts.cocRest}Mohemm_ITG_GetDepartmentSections";
|
||||||
|
Map<String, dynamic> postParams = {
|
||||||
|
"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER,
|
||||||
|
"ItgDepartmentSectionId": projectDepartmentID,
|
||||||
|
"ItgProjectDepartmentId": projectDepartmentID
|
||||||
|
};
|
||||||
|
|
||||||
|
postParams.addAll(AppState().postParamsJson);
|
||||||
|
return await ApiClient().postJsonForObject((json) {
|
||||||
|
GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
|
||||||
|
return responseData.getDepartmentSections ?? [];
|
||||||
|
}, url, postParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<List<GetSectionTopics>> getSectionTopics(int? departmentSectionID) async {
|
||||||
|
String url = "${ApiConsts.cocRest}Mohemm_ITG_GetSectionTopics";
|
||||||
|
Map<String, dynamic> postParams = {"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER, "ItgDepartmentSectionId": departmentSectionID};
|
||||||
|
|
||||||
|
postParams.addAll(AppState().postParamsJson);
|
||||||
|
return await ApiClient().postJsonForObject((json) {
|
||||||
|
GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
|
||||||
|
return responseData.getSectionTopics ?? [];
|
||||||
|
}, url, postParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<int?> submitRequest(int? departmentID, String description, int? projectID, String? sectionID, String? sectionTopicID, int? ticketTypeID, List<Map<String, dynamic>> attachmentList) async {
|
||||||
|
String url = "${ApiConsts.cocRest}Mohemm_ITG_CreateTicketMobile";
|
||||||
|
Map<String, dynamic> postParams = {
|
||||||
|
"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER,
|
||||||
|
"ItgImageCollList" : attachmentList,
|
||||||
|
"channelId": 3,
|
||||||
|
"departmentId": departmentID,
|
||||||
|
"description": description,
|
||||||
|
"employeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER,
|
||||||
|
"projectId": projectID,
|
||||||
|
"sectionId": sectionID,
|
||||||
|
"sectionTopicId": sectionTopicID,
|
||||||
|
"ticketStatus": "new",
|
||||||
|
"ticketTypeId": ticketTypeID
|
||||||
|
};
|
||||||
|
|
||||||
|
postParams.addAll(AppState().postParamsJson);
|
||||||
|
return await ApiClient().postJsonForObject((json) {
|
||||||
|
GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
|
||||||
|
return responseData.messageStatus;
|
||||||
|
}, url, postParams);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
class GetDepartmentSections {
|
||||||
|
int? departmentId;
|
||||||
|
String? departmentName;
|
||||||
|
int? departmentSectionId;
|
||||||
|
String? projectCode;
|
||||||
|
int? projectId;
|
||||||
|
String? projectName;
|
||||||
|
int? sectionId;
|
||||||
|
String? sectionName;
|
||||||
|
|
||||||
|
GetDepartmentSections(
|
||||||
|
{this.departmentId,
|
||||||
|
this.departmentName,
|
||||||
|
this.departmentSectionId,
|
||||||
|
this.projectCode,
|
||||||
|
this.projectId,
|
||||||
|
this.projectName,
|
||||||
|
this.sectionId,
|
||||||
|
this.sectionName});
|
||||||
|
|
||||||
|
GetDepartmentSections.fromJson(Map<String, dynamic> json) {
|
||||||
|
departmentId = json['departmentId'];
|
||||||
|
departmentName = json['departmentName'];
|
||||||
|
departmentSectionId = json['departmentSectionId'];
|
||||||
|
projectCode = json['projectCode'];
|
||||||
|
projectId = json['projectId'];
|
||||||
|
projectName = json['projectName'];
|
||||||
|
sectionId = json['sectionId'];
|
||||||
|
sectionName = json['sectionName'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
data['departmentId'] = this.departmentId;
|
||||||
|
data['departmentName'] = this.departmentName;
|
||||||
|
data['departmentSectionId'] = this.departmentSectionId;
|
||||||
|
data['projectCode'] = this.projectCode;
|
||||||
|
data['projectId'] = this.projectId;
|
||||||
|
data['projectName'] = this.projectName;
|
||||||
|
data['sectionId'] = this.sectionId;
|
||||||
|
data['sectionName'] = this.sectionName;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
class GetProjectDepartments {
|
||||||
|
int? departmentId;
|
||||||
|
String? departmentName;
|
||||||
|
String? projectCode;
|
||||||
|
int? projectDepartmentId;
|
||||||
|
String? projectName;
|
||||||
|
|
||||||
|
GetProjectDepartments(
|
||||||
|
{this.departmentId,
|
||||||
|
this.departmentName,
|
||||||
|
this.projectCode,
|
||||||
|
this.projectDepartmentId,
|
||||||
|
this.projectName});
|
||||||
|
|
||||||
|
GetProjectDepartments.fromJson(Map<String, dynamic> json) {
|
||||||
|
departmentId = json['departmentId'];
|
||||||
|
departmentName = json['departmentName'];
|
||||||
|
projectCode = json['projectCode'];
|
||||||
|
projectDepartmentId = json['projectDepartmentId'];
|
||||||
|
projectName = json['projectName'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
data['departmentId'] = this.departmentId;
|
||||||
|
data['departmentName'] = this.departmentName;
|
||||||
|
data['projectCode'] = this.projectCode;
|
||||||
|
data['projectDepartmentId'] = this.projectDepartmentId;
|
||||||
|
data['projectName'] = this.projectName;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
class GetMowadhafhiProjects {
|
||||||
|
int? projectId;
|
||||||
|
String? projectName;
|
||||||
|
|
||||||
|
GetMowadhafhiProjects({this.projectId, this.projectName});
|
||||||
|
|
||||||
|
GetMowadhafhiProjects.fromJson(Map<String, dynamic> json) {
|
||||||
|
projectId = json['projectId'];
|
||||||
|
projectName = json['projectName'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
data['projectId'] = this.projectId;
|
||||||
|
data['projectName'] = this.projectName;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,60 @@
|
|||||||
|
class GetSectionTopics {
|
||||||
|
int? departmentId;
|
||||||
|
String? departmentName;
|
||||||
|
String? projectCode;
|
||||||
|
int? projectDepartmentId;
|
||||||
|
int? projectId;
|
||||||
|
String? projectName;
|
||||||
|
int? sectionId;
|
||||||
|
String? sectionName;
|
||||||
|
int? sectionTopicId;
|
||||||
|
int? tatInHours;
|
||||||
|
int? topicId;
|
||||||
|
String? topicName;
|
||||||
|
|
||||||
|
GetSectionTopics(
|
||||||
|
{this.departmentId,
|
||||||
|
this.departmentName,
|
||||||
|
this.projectCode,
|
||||||
|
this.projectDepartmentId,
|
||||||
|
this.projectId,
|
||||||
|
this.projectName,
|
||||||
|
this.sectionId,
|
||||||
|
this.sectionName,
|
||||||
|
this.sectionTopicId,
|
||||||
|
this.tatInHours,
|
||||||
|
this.topicId,
|
||||||
|
this.topicName});
|
||||||
|
|
||||||
|
GetSectionTopics.fromJson(Map<String, dynamic> json) {
|
||||||
|
departmentId = json['departmentId'];
|
||||||
|
departmentName = json['departmentName'];
|
||||||
|
projectCode = json['projectCode'];
|
||||||
|
projectDepartmentId = json['projectDepartmentId'];
|
||||||
|
projectId = json['projectId'];
|
||||||
|
projectName = json['projectName'];
|
||||||
|
sectionId = json['sectionId'];
|
||||||
|
sectionName = json['sectionName'];
|
||||||
|
sectionTopicId = json['sectionTopicId'];
|
||||||
|
tatInHours = json['tatInHours'];
|
||||||
|
topicId = json['topicId'];
|
||||||
|
topicName = json['topicName'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
data['departmentId'] = this.departmentId;
|
||||||
|
data['departmentName'] = this.departmentName;
|
||||||
|
data['projectCode'] = this.projectCode;
|
||||||
|
data['projectDepartmentId'] = this.projectDepartmentId;
|
||||||
|
data['projectId'] = this.projectId;
|
||||||
|
data['projectName'] = this.projectName;
|
||||||
|
data['sectionId'] = this.sectionId;
|
||||||
|
data['sectionName'] = this.sectionName;
|
||||||
|
data['sectionTopicId'] = this.sectionTopicId;
|
||||||
|
data['tatInHours'] = this.tatInHours;
|
||||||
|
data['topicId'] = this.topicId;
|
||||||
|
data['topicName'] = this.topicName;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,80 @@
|
|||||||
|
class GetTicketDetailsByEmployee {
|
||||||
|
String? closedBy;
|
||||||
|
String? created;
|
||||||
|
int? departmentId;
|
||||||
|
String? departmentName;
|
||||||
|
String? description;
|
||||||
|
String? positionTitle;
|
||||||
|
int? projectId;
|
||||||
|
String? projectName;
|
||||||
|
int? sectionId;
|
||||||
|
String? sectionName;
|
||||||
|
String? ticketId;
|
||||||
|
String? ticketReferenceNo;
|
||||||
|
String? ticketStatusInternalName;
|
||||||
|
String? ticketStatusName;
|
||||||
|
int? ticketTypeId;
|
||||||
|
int? topicId;
|
||||||
|
String? topicName;
|
||||||
|
|
||||||
|
GetTicketDetailsByEmployee(
|
||||||
|
{this.closedBy,
|
||||||
|
this.created,
|
||||||
|
this.departmentId,
|
||||||
|
this.departmentName,
|
||||||
|
this.description,
|
||||||
|
this.positionTitle,
|
||||||
|
this.projectId,
|
||||||
|
this.projectName,
|
||||||
|
this.sectionId,
|
||||||
|
this.sectionName,
|
||||||
|
this.ticketId,
|
||||||
|
this.ticketReferenceNo,
|
||||||
|
this.ticketStatusInternalName,
|
||||||
|
this.ticketStatusName,
|
||||||
|
this.ticketTypeId,
|
||||||
|
this.topicId,
|
||||||
|
this.topicName});
|
||||||
|
|
||||||
|
GetTicketDetailsByEmployee.fromJson(Map<String, dynamic> json) {
|
||||||
|
closedBy = json['closedBy'];
|
||||||
|
created = json['created'];
|
||||||
|
departmentId = json['departmentId'];
|
||||||
|
departmentName = json['departmentName'];
|
||||||
|
description = json['description'];
|
||||||
|
positionTitle = json['positionTitle'];
|
||||||
|
projectId = json['projectId'];
|
||||||
|
projectName = json['projectName'];
|
||||||
|
sectionId = json['sectionId'];
|
||||||
|
sectionName = json['sectionName'];
|
||||||
|
ticketId = json['ticketId'];
|
||||||
|
ticketReferenceNo = json['ticketReferenceNo'];
|
||||||
|
ticketStatusInternalName = json['ticketStatusInternalName'];
|
||||||
|
ticketStatusName = json['ticketStatusName'];
|
||||||
|
ticketTypeId = json['ticketTypeId'];
|
||||||
|
topicId = json['topicId'];
|
||||||
|
topicName = json['topicName'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
data['closedBy'] = this.closedBy;
|
||||||
|
data['created'] = this.created;
|
||||||
|
data['departmentId'] = this.departmentId;
|
||||||
|
data['departmentName'] = this.departmentName;
|
||||||
|
data['description'] = this.description;
|
||||||
|
data['positionTitle'] = this.positionTitle;
|
||||||
|
data['projectId'] = this.projectId;
|
||||||
|
data['projectName'] = this.projectName;
|
||||||
|
data['sectionId'] = this.sectionId;
|
||||||
|
data['sectionName'] = this.sectionName;
|
||||||
|
data['ticketId'] = this.ticketId;
|
||||||
|
data['ticketReferenceNo'] = this.ticketReferenceNo;
|
||||||
|
data['ticketStatusInternalName'] = this.ticketStatusInternalName;
|
||||||
|
data['ticketStatusName'] = this.ticketStatusName;
|
||||||
|
data['ticketTypeId'] = this.ticketTypeId;
|
||||||
|
data['topicId'] = this.topicId;
|
||||||
|
data['topicName'] = this.topicName;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
class GetTicketTransactions {
|
||||||
|
String? actionBy;
|
||||||
|
String? actionDate;
|
||||||
|
String? comments;
|
||||||
|
String? statusDisplayText;
|
||||||
|
String? statusName;
|
||||||
|
String? ticketId;
|
||||||
|
int? ticketTransactionId;
|
||||||
|
|
||||||
|
GetTicketTransactions(
|
||||||
|
{this.actionBy,
|
||||||
|
this.actionDate,
|
||||||
|
this.comments,
|
||||||
|
this.statusDisplayText,
|
||||||
|
this.statusName,
|
||||||
|
this.ticketId,
|
||||||
|
this.ticketTransactionId});
|
||||||
|
|
||||||
|
GetTicketTransactions.fromJson(Map<String, dynamic> json) {
|
||||||
|
actionBy = json['actionBy'];
|
||||||
|
actionDate = json['actionDate'];
|
||||||
|
comments = json['comments'];
|
||||||
|
statusDisplayText = json['statusDisplayText'];
|
||||||
|
statusName = json['statusName'];
|
||||||
|
ticketId = json['ticketId'];
|
||||||
|
ticketTransactionId = json['ticketTransactionId'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
data['actionBy'] = this.actionBy;
|
||||||
|
data['actionDate'] = this.actionDate;
|
||||||
|
data['comments'] = this.comments;
|
||||||
|
data['statusDisplayText'] = this.statusDisplayText;
|
||||||
|
data['statusName'] = this.statusName;
|
||||||
|
data['ticketId'] = this.ticketId;
|
||||||
|
data['ticketTransactionId'] = this.ticketTransactionId;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
class GetTicketTypes {
|
||||||
|
String? ticketIdPrefix;
|
||||||
|
int? ticketTypeId;
|
||||||
|
String? typeName;
|
||||||
|
|
||||||
|
GetTicketTypes({this.ticketIdPrefix, this.ticketTypeId, this.typeName});
|
||||||
|
|
||||||
|
GetTicketTypes.fromJson(Map<String, dynamic> json) {
|
||||||
|
ticketIdPrefix = json['ticketIdPrefix'];
|
||||||
|
ticketTypeId = json['ticketTypeId'];
|
||||||
|
typeName = json['typeName'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
data['ticketIdPrefix'] = this.ticketIdPrefix;
|
||||||
|
data['ticketTypeId'] = this.ticketTypeId;
|
||||||
|
data['typeName'] = this.typeName;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,184 @@
|
|||||||
|
class GetTicketsByEmployeeList {
|
||||||
|
dynamic agentRating;
|
||||||
|
dynamic assignedSpecialist;
|
||||||
|
String? assignedSpecialistName;
|
||||||
|
String? assignedToSpecialistAt;
|
||||||
|
int? channelId;
|
||||||
|
String? channelName;
|
||||||
|
String? closedBy;
|
||||||
|
String? closedDate;
|
||||||
|
String? created;
|
||||||
|
int? departmentId;
|
||||||
|
String? departmentName;
|
||||||
|
String? description;
|
||||||
|
String? employeeEmail;
|
||||||
|
String? employeeName;
|
||||||
|
int? employeeNumber;
|
||||||
|
String? firstName;
|
||||||
|
dynamic isActive;
|
||||||
|
bool? isClosedDirectly;
|
||||||
|
dynamic isEscalated;
|
||||||
|
bool? isExceedTAT;
|
||||||
|
String? lastName;
|
||||||
|
String? mobileNumber;
|
||||||
|
dynamic pageNo;
|
||||||
|
dynamic pageSize;
|
||||||
|
String? positionTitle;
|
||||||
|
int? projectId;
|
||||||
|
String? projectManager;
|
||||||
|
String? projectName;
|
||||||
|
String? providedSolution;
|
||||||
|
int? sectionId;
|
||||||
|
String? sectionName;
|
||||||
|
dynamic serviceRating;
|
||||||
|
String? specialistDeadline;
|
||||||
|
String? ticketId;
|
||||||
|
String? ticketReferenceNo;
|
||||||
|
int? ticketStatusId;
|
||||||
|
String? ticketStatusInternalName;
|
||||||
|
String? ticketStatusName;
|
||||||
|
int? ticketTypeId;
|
||||||
|
String? ticketTypeName;
|
||||||
|
int? topicId;
|
||||||
|
String? topicName;
|
||||||
|
int? totalItemsCount;
|
||||||
|
|
||||||
|
GetTicketsByEmployeeList(
|
||||||
|
{this.agentRating,
|
||||||
|
this.assignedSpecialist,
|
||||||
|
this.assignedSpecialistName,
|
||||||
|
this.assignedToSpecialistAt,
|
||||||
|
this.channelId,
|
||||||
|
this.channelName,
|
||||||
|
this.closedBy,
|
||||||
|
this.closedDate,
|
||||||
|
this.created,
|
||||||
|
this.departmentId,
|
||||||
|
this.departmentName,
|
||||||
|
this.description,
|
||||||
|
this.employeeEmail,
|
||||||
|
this.employeeName,
|
||||||
|
this.employeeNumber,
|
||||||
|
this.firstName,
|
||||||
|
this.isActive,
|
||||||
|
this.isClosedDirectly,
|
||||||
|
this.isEscalated,
|
||||||
|
this.isExceedTAT,
|
||||||
|
this.lastName,
|
||||||
|
this.mobileNumber,
|
||||||
|
this.pageNo,
|
||||||
|
this.pageSize,
|
||||||
|
this.positionTitle,
|
||||||
|
this.projectId,
|
||||||
|
this.projectManager,
|
||||||
|
this.projectName,
|
||||||
|
this.providedSolution,
|
||||||
|
this.sectionId,
|
||||||
|
this.sectionName,
|
||||||
|
this.serviceRating,
|
||||||
|
this.specialistDeadline,
|
||||||
|
this.ticketId,
|
||||||
|
this.ticketReferenceNo,
|
||||||
|
this.ticketStatusId,
|
||||||
|
this.ticketStatusInternalName,
|
||||||
|
this.ticketStatusName,
|
||||||
|
this.ticketTypeId,
|
||||||
|
this.ticketTypeName,
|
||||||
|
this.topicId,
|
||||||
|
this.topicName,
|
||||||
|
this.totalItemsCount});
|
||||||
|
|
||||||
|
GetTicketsByEmployeeList.fromJson(Map<String, dynamic> json) {
|
||||||
|
agentRating = json['agentRating'];
|
||||||
|
assignedSpecialist = json['assignedSpecialist'];
|
||||||
|
assignedSpecialistName = json['assignedSpecialistName'];
|
||||||
|
assignedToSpecialistAt = json['assignedToSpecialistAt'];
|
||||||
|
channelId = json['channelId'];
|
||||||
|
channelName = json['channelName'];
|
||||||
|
closedBy = json['closedBy'];
|
||||||
|
closedDate = json['closedDate'];
|
||||||
|
created = json['created'];
|
||||||
|
departmentId = json['departmentId'];
|
||||||
|
departmentName = json['departmentName'];
|
||||||
|
description = json['description'];
|
||||||
|
employeeEmail = json['employeeEmail'];
|
||||||
|
employeeName = json['employeeName'];
|
||||||
|
employeeNumber = json['employeeNumber'];
|
||||||
|
firstName = json['firstName'];
|
||||||
|
isActive = json['isActive'];
|
||||||
|
isClosedDirectly = json['isClosedDirectly'];
|
||||||
|
isEscalated = json['isEscalated'];
|
||||||
|
isExceedTAT = json['isExceedTAT'];
|
||||||
|
lastName = json['lastName'];
|
||||||
|
mobileNumber = json['mobileNumber'];
|
||||||
|
pageNo = json['pageNo'];
|
||||||
|
pageSize = json['pageSize'];
|
||||||
|
positionTitle = json['positionTitle'];
|
||||||
|
projectId = json['projectId'];
|
||||||
|
projectManager = json['projectManager'];
|
||||||
|
projectName = json['projectName'];
|
||||||
|
providedSolution = json['providedSolution'];
|
||||||
|
sectionId = json['sectionId'];
|
||||||
|
sectionName = json['sectionName'];
|
||||||
|
serviceRating = json['serviceRating'];
|
||||||
|
specialistDeadline = json['specialistDeadline'];
|
||||||
|
ticketId = json['ticketId'];
|
||||||
|
ticketReferenceNo = json['ticketReferenceNo'];
|
||||||
|
ticketStatusId = json['ticketStatusId'];
|
||||||
|
ticketStatusInternalName = json['ticketStatusInternalName'];
|
||||||
|
ticketStatusName = json['ticketStatusName'];
|
||||||
|
ticketTypeId = json['ticketTypeId'];
|
||||||
|
ticketTypeName = json['ticketTypeName'];
|
||||||
|
topicId = json['topicId'];
|
||||||
|
topicName = json['topicName'];
|
||||||
|
totalItemsCount = json['totalItemsCount'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = <String, dynamic>{};
|
||||||
|
data['agentRating'] = agentRating;
|
||||||
|
data['assignedSpecialist'] = assignedSpecialist;
|
||||||
|
data['assignedSpecialistName'] = assignedSpecialistName;
|
||||||
|
data['assignedToSpecialistAt'] = assignedToSpecialistAt;
|
||||||
|
data['channelId'] = channelId;
|
||||||
|
data['channelName'] = channelName;
|
||||||
|
data['closedBy'] = closedBy;
|
||||||
|
data['closedDate'] = closedDate;
|
||||||
|
data['created'] = created;
|
||||||
|
data['departmentId'] = departmentId;
|
||||||
|
data['departmentName'] = departmentName;
|
||||||
|
data['description'] = description;
|
||||||
|
data['employeeEmail'] = employeeEmail;
|
||||||
|
data['employeeName'] = employeeName;
|
||||||
|
data['employeeNumber'] = employeeNumber;
|
||||||
|
data['firstName'] = firstName;
|
||||||
|
data['isActive'] = isActive;
|
||||||
|
data['isClosedDirectly'] = isClosedDirectly;
|
||||||
|
data['isEscalated'] = isEscalated;
|
||||||
|
data['isExceedTAT'] = isExceedTAT;
|
||||||
|
data['lastName'] = lastName;
|
||||||
|
data['mobileNumber'] = mobileNumber;
|
||||||
|
data['pageNo'] = pageNo;
|
||||||
|
data['pageSize'] = pageSize;
|
||||||
|
data['positionTitle'] = positionTitle;
|
||||||
|
data['projectId'] = projectId;
|
||||||
|
data['projectManager'] = projectManager;
|
||||||
|
data['projectName'] = projectName;
|
||||||
|
data['providedSolution'] = providedSolution;
|
||||||
|
data['sectionId'] = sectionId;
|
||||||
|
data['sectionName'] = sectionName;
|
||||||
|
data['serviceRating'] = serviceRating;
|
||||||
|
data['specialistDeadline'] = specialistDeadline;
|
||||||
|
data['ticketId'] = ticketId;
|
||||||
|
data['ticketReferenceNo'] = ticketReferenceNo;
|
||||||
|
data['ticketStatusId'] = ticketStatusId;
|
||||||
|
data['ticketStatusInternalName'] = ticketStatusInternalName;
|
||||||
|
data['ticketStatusName'] = ticketStatusName;
|
||||||
|
data['ticketTypeId'] = ticketTypeId;
|
||||||
|
data['ticketTypeName'] = ticketTypeName;
|
||||||
|
data['topicId'] = topicId;
|
||||||
|
data['topicName'] = topicName;
|
||||||
|
data['totalItemsCount'] = totalItemsCount;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
class MowadhafhiRequestAttachment {
|
||||||
|
String? base64Data;
|
||||||
|
String? fileName;
|
||||||
|
String? contentType;
|
||||||
|
|
||||||
|
MowadhafhiRequestAttachment(
|
||||||
|
{this.base64Data, this.fileName, this.contentType});
|
||||||
|
|
||||||
|
MowadhafhiRequestAttachment.fromJson(Map<String, dynamic> json) {
|
||||||
|
base64Data = json['Base64Data'];
|
||||||
|
fileName = json['FileName'];
|
||||||
|
contentType = json['ContentType'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
data['Base64Data'] = this.base64Data;
|
||||||
|
data['FileName'] = this.fileName;
|
||||||
|
data['ContentType'] = this.contentType;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
class SubmitPhonesTransactionList {
|
||||||
|
String? pITEMKEY;
|
||||||
|
String? pRETURNMSG;
|
||||||
|
String? pRETURNSTATUS;
|
||||||
|
int? pTRANSACTIONID;
|
||||||
|
|
||||||
|
SubmitPhonesTransactionList({this.pITEMKEY, this.pRETURNMSG, this.pRETURNSTATUS, this.pTRANSACTIONID});
|
||||||
|
|
||||||
|
SubmitPhonesTransactionList.fromJson(Map<String, dynamic> json) {
|
||||||
|
pITEMKEY = json['P_ITEM_KEY'];
|
||||||
|
pRETURNMSG = json['P_RETURN_MSG'];
|
||||||
|
pRETURNSTATUS = json['P_RETURN_STATUS'];
|
||||||
|
pTRANSACTIONID = json['P_TRANSACTION_ID'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
data['P_ITEM_KEY'] = this.pITEMKEY;
|
||||||
|
data['P_RETURN_MSG'] = this.pRETURNMSG;
|
||||||
|
data['P_RETURN_STATUS'] = this.pRETURNSTATUS;
|
||||||
|
data['P_TRANSACTION_ID'] = this.pTRANSACTIONID;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,146 @@
|
|||||||
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_svg/svg.dart';
|
||||||
|
import 'package:mohem_flutter_app/api/mowadhafhi/mowadhafhi_api_client.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/colors.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/utils.dart';
|
||||||
|
import 'package:mohem_flutter_app/config/routes.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/mowadhafhi/get_tickets_list.dart';
|
||||||
|
import 'package:mohem_flutter_app/widgets/button/default_button.dart';
|
||||||
|
|
||||||
|
import '../../../widgets/app_bar_widget.dart';
|
||||||
|
|
||||||
|
class MowadhafhiHome extends StatefulWidget {
|
||||||
|
const MowadhafhiHome({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_MowadhafhiHomeState createState() => _MowadhafhiHomeState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _MowadhafhiHomeState extends State<MowadhafhiHome> {
|
||||||
|
List<GetTicketsByEmployeeList> getTicketsByEmployeeList = [];
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
getOpenTickets();
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
backgroundColor: Colors.white,
|
||||||
|
appBar: AppBarWidget(
|
||||||
|
context,
|
||||||
|
title: "Mowadhafhi Request",
|
||||||
|
),
|
||||||
|
body: Container(
|
||||||
|
margin: const EdgeInsets.only(top: 10.0),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: ListView.separated(
|
||||||
|
physics: const BouncingScrollPhysics(),
|
||||||
|
shrinkWrap: true,
|
||||||
|
itemBuilder: (BuildContext context, int index) {
|
||||||
|
return InkWell(
|
||||||
|
onTap: () {
|
||||||
|
openRequestDetails(getTicketsByEmployeeList[index].ticketId!);
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
width: double.infinity,
|
||||||
|
// height: 100.0,
|
||||||
|
padding: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10),
|
||||||
|
margin: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.circular(10),
|
||||||
|
boxShadow: [
|
||||||
|
BoxShadow(
|
||||||
|
color: const Color(0xff000000).withOpacity(.05),
|
||||||
|
blurRadius: 26,
|
||||||
|
offset: const Offset(0, -3),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
getTicketsByEmployeeList[index].ticketTypeName!.toText14(color: MyColors.grey57Color),
|
||||||
|
getTicketsByEmployeeList[index].created!.split(" ")[0].toText12(color: MyColors.grey70Color),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
padding: const EdgeInsets.only(top: 10.0),
|
||||||
|
child: getTicketsByEmployeeList[index].description!.toText12(color: MyColors.grey57Color),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
padding: const EdgeInsets.only(top: 10.0),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
getTicketsByEmployeeList[index].ticketStatusInternalName!.toText14(color: MyColors.gradiantEndColor),
|
||||||
|
SvgPicture.asset(
|
||||||
|
"assets/images/arrow_next.svg",
|
||||||
|
color: MyColors.darkIconColor,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
separatorBuilder: (BuildContext context, int index) => 12.height,
|
||||||
|
itemCount: getTicketsByEmployeeList.length ?? 0)),
|
||||||
|
80.height
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
bottomSheet: Container(
|
||||||
|
decoration: const BoxDecoration(
|
||||||
|
color: MyColors.white,
|
||||||
|
boxShadow: [
|
||||||
|
BoxShadow(color: MyColors.lightGreyEFColor, spreadRadius: 3),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
child: DefaultButton(LocaleKeys.createRequest.tr(), () async {
|
||||||
|
openHRRequest();
|
||||||
|
}).insideContainer,
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void openRequestDetails(String itgTicketID) async {
|
||||||
|
await Navigator.pushNamed(context, AppRoutes.mowadhafhiDetails, arguments: itgTicketID);
|
||||||
|
}
|
||||||
|
|
||||||
|
void openHRRequest() async {
|
||||||
|
await Navigator.pushNamed(context, AppRoutes.mowadhafhiHRRequest).then((value) {
|
||||||
|
getOpenTickets();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void getOpenTickets() async {
|
||||||
|
try {
|
||||||
|
Utils.showLoading(context);
|
||||||
|
getTicketsByEmployeeList.clear();
|
||||||
|
getTicketsByEmployeeList = await MowadhafhiApiClient().getTicketsByEmployee();
|
||||||
|
Utils.hideLoading(context);
|
||||||
|
setState(() {});
|
||||||
|
} catch (ex) {
|
||||||
|
Utils.hideLoading(context);
|
||||||
|
Utils.handleException(ex, context, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,387 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:file_picker/file_picker.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:mohem_flutter_app/api/mowadhafhi/mowadhafhi_api_client.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/colors.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/utils.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/mowadhafhi/get_department_sections.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/mowadhafhi/get_project_departments.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/mowadhafhi/get_projects.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/mowadhafhi/get_section_topics.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_types.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/mowadhafhi/mowadhafhi_attachement_request.dart';
|
||||||
|
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
|
||||||
|
import 'package:mohem_flutter_app/widgets/button/default_button.dart';
|
||||||
|
import 'package:mohem_flutter_app/widgets/button/simple_button.dart';
|
||||||
|
import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart';
|
||||||
|
import 'package:mohem_flutter_app/widgets/radio/show_radio.dart';
|
||||||
|
|
||||||
|
class MowadhafhiHRRequest extends StatefulWidget {
|
||||||
|
const MowadhafhiHRRequest({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_MowadhafhiHRRequestState createState() => _MowadhafhiHRRequestState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _MowadhafhiHRRequestState extends State<MowadhafhiHRRequest> {
|
||||||
|
List<GetTicketTypes> getTicketTypesList = [];
|
||||||
|
List<GetMowadhafhiProjects> getMowadhafhiProjectsList = [];
|
||||||
|
List<GetProjectDepartments> getProjectDepartmentsList = [];
|
||||||
|
List<GetDepartmentSections> getDepartmentSectionsList = [];
|
||||||
|
List<GetSectionTopics> getSectionTopicsList = [];
|
||||||
|
|
||||||
|
GetProjectDepartments? selectedDepartment;
|
||||||
|
GetDepartmentSections? selectedSection;
|
||||||
|
GetSectionTopics? selectedTopic;
|
||||||
|
List<File> attachmentFiles = [];
|
||||||
|
|
||||||
|
String selectedServiceType = "";
|
||||||
|
String description = "";
|
||||||
|
int? projectID;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
getTicketTypes();
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
backgroundColor: Colors.white,
|
||||||
|
appBar: AppBarWidget(
|
||||||
|
context,
|
||||||
|
title: "Mowadhafhi Request",
|
||||||
|
),
|
||||||
|
body: SingleChildScrollView(
|
||||||
|
child: getTicketTypesList.isNotEmpty
|
||||||
|
? Container(
|
||||||
|
width: double.infinity,
|
||||||
|
padding: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10),
|
||||||
|
margin: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.circular(10),
|
||||||
|
boxShadow: [
|
||||||
|
BoxShadow(
|
||||||
|
color: const Color(0xff000000).withOpacity(.05),
|
||||||
|
blurRadius: 26,
|
||||||
|
offset: const Offset(0, -3),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
"Service Type: ".toText16(),
|
||||||
|
12.height,
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
SizedBox(
|
||||||
|
height: 40,
|
||||||
|
child: ListView.separated(
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
return Container(
|
||||||
|
padding: const EdgeInsets.only(right: 6, top: 8, bottom: 8),
|
||||||
|
child: ShowRadio(
|
||||||
|
title: getTicketTypesList[index].typeName!,
|
||||||
|
value: getTicketTypesList[index].ticketTypeId!.toString(),
|
||||||
|
groupValue: selectedServiceType,
|
||||||
|
selectedColor: MyColors.gradiantStartColor),
|
||||||
|
).onPress(() {
|
||||||
|
debugPrint(getTicketTypesList[index].typeName!);
|
||||||
|
selectedServiceType = getTicketTypesList[index].ticketTypeId!.toString();
|
||||||
|
setState(() {});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
separatorBuilder: (context, index) => 1.width,
|
||||||
|
shrinkWrap: true,
|
||||||
|
itemCount: getTicketTypesList.length ?? 0,
|
||||||
|
scrollDirection: Axis.horizontal,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
12.height,
|
||||||
|
"Department Name: ".toText16(),
|
||||||
|
12.height,
|
||||||
|
PopupMenuButton(
|
||||||
|
child: DynamicTextFieldWidget(
|
||||||
|
"Select Department",
|
||||||
|
selectedDepartment?.departmentName ?? "",
|
||||||
|
isEnable: false,
|
||||||
|
isPopup: true,
|
||||||
|
isInputTypeNum: true,
|
||||||
|
isReadOnly: false,
|
||||||
|
).paddingOnly(bottom: 12),
|
||||||
|
itemBuilder: (_) => <PopupMenuItem<int>>[
|
||||||
|
for (int i = 0; i < getProjectDepartmentsList!.length; i++) PopupMenuItem<int>(child: Text(getProjectDepartmentsList![i].departmentName!), value: i),
|
||||||
|
],
|
||||||
|
onSelected: (int popupIndex) {
|
||||||
|
selectedDepartment = getProjectDepartmentsList![popupIndex];
|
||||||
|
getDepartmentSections(selectedDepartment?.projectDepartmentId);
|
||||||
|
setState(() {});
|
||||||
|
}),
|
||||||
|
12.height,
|
||||||
|
"Related Section: ".toText16(),
|
||||||
|
12.height,
|
||||||
|
PopupMenuButton(
|
||||||
|
child: DynamicTextFieldWidget(
|
||||||
|
"Select Section",
|
||||||
|
selectedSection?.sectionName ?? "",
|
||||||
|
isEnable: false,
|
||||||
|
isPopup: true,
|
||||||
|
isInputTypeNum: true,
|
||||||
|
isReadOnly: false,
|
||||||
|
).paddingOnly(bottom: 12),
|
||||||
|
itemBuilder: (_) => <PopupMenuItem<int>>[
|
||||||
|
for (int i = 0; i < getDepartmentSectionsList!.length; i++) PopupMenuItem<int>(child: Text(getDepartmentSectionsList![i].sectionName!), value: i),
|
||||||
|
],
|
||||||
|
onSelected: (int popupIndex) {
|
||||||
|
selectedSection = getDepartmentSectionsList![popupIndex];
|
||||||
|
getSectionTopics(selectedSection?.departmentSectionId);
|
||||||
|
setState(() {});
|
||||||
|
}),
|
||||||
|
12.height,
|
||||||
|
"Related Topic: ".toText16(),
|
||||||
|
12.height,
|
||||||
|
PopupMenuButton(
|
||||||
|
child: DynamicTextFieldWidget(
|
||||||
|
"Select Topic",
|
||||||
|
selectedTopic?.topicName ?? "",
|
||||||
|
isEnable: false,
|
||||||
|
isPopup: true,
|
||||||
|
isInputTypeNum: true,
|
||||||
|
isReadOnly: false,
|
||||||
|
).paddingOnly(bottom: 12),
|
||||||
|
itemBuilder: (_) => <PopupMenuItem<int>>[
|
||||||
|
for (int i = 0; i < getSectionTopicsList!.length; i++) PopupMenuItem<int>(child: Text(getSectionTopicsList![i].topicName!), value: i),
|
||||||
|
],
|
||||||
|
onSelected: (int popupIndex) {
|
||||||
|
selectedTopic = getSectionTopicsList![popupIndex];
|
||||||
|
// getDepartmentSections(selectedSection?.departmentSectionId);
|
||||||
|
setState(() {});
|
||||||
|
}),
|
||||||
|
12.height,
|
||||||
|
"Supporting Document: ".toText16(),
|
||||||
|
12.height,
|
||||||
|
attachmentView("Attachments"),
|
||||||
|
12.height,
|
||||||
|
"Description: ".toText16(),
|
||||||
|
12.height,
|
||||||
|
DynamicTextFieldWidget(
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
isEnable: true,
|
||||||
|
isPopup: false,
|
||||||
|
lines: 4,
|
||||||
|
isInputTypeNum: false,
|
||||||
|
isReadOnly: false,
|
||||||
|
onChange: (String value) {
|
||||||
|
debugPrint(value);
|
||||||
|
description = value;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
50.height
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
: Container(),
|
||||||
|
),
|
||||||
|
bottomSheet: Container(
|
||||||
|
padding: const EdgeInsets.only(top: 8.0, bottom: 8.0),
|
||||||
|
decoration: const BoxDecoration(
|
||||||
|
color: MyColors.white,
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
12.width,
|
||||||
|
Expanded(
|
||||||
|
child: DefaultButton(
|
||||||
|
"Submit",
|
||||||
|
!checkValidation()
|
||||||
|
? null
|
||||||
|
: () {
|
||||||
|
submitHRRequest();
|
||||||
|
},
|
||||||
|
color: const Color(0xFFD02127),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
12.width,
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool checkValidation() {
|
||||||
|
if (selectedServiceType == "" || selectedDepartment == null || selectedSection == null || selectedTopic == null) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget attachmentView(String title) {
|
||||||
|
return Container(
|
||||||
|
padding: const EdgeInsets.only(top: 15, bottom: 15, left: 14, right: 14),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.circular(15),
|
||||||
|
boxShadow: [
|
||||||
|
BoxShadow(
|
||||||
|
color: const Color(0xff000000).withOpacity(.05),
|
||||||
|
blurRadius: 26,
|
||||||
|
offset: const Offset(0, -3),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
title.toText16().expanded,
|
||||||
|
6.width,
|
||||||
|
SimpleButton("Add", () async {
|
||||||
|
FilePickerResult? result = await FilePicker.platform.pickFiles(allowMultiple: true);
|
||||||
|
if (result != null) {
|
||||||
|
attachmentFiles = attachmentFiles + result.paths.map((path) => File(path!)).toList();
|
||||||
|
attachmentFiles = attachmentFiles.toSet().toList();
|
||||||
|
setState(() {});
|
||||||
|
}
|
||||||
|
}, fontSize: 14),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
if (attachmentFiles.isNotEmpty) 12.height,
|
||||||
|
if (attachmentFiles.isNotEmpty)
|
||||||
|
ListView.separated(
|
||||||
|
shrinkWrap: true,
|
||||||
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
|
itemBuilder: (cxt, index) {
|
||||||
|
String fileName = attachmentFiles[index].path.split('/').last;
|
||||||
|
|
||||||
|
return Row(
|
||||||
|
children: [
|
||||||
|
fileName.toText13().expanded,
|
||||||
|
6.width,
|
||||||
|
IconButton(
|
||||||
|
padding: EdgeInsets.zero,
|
||||||
|
iconSize: 20,
|
||||||
|
icon: const Icon(Icons.cancel_rounded),
|
||||||
|
color: MyColors.redColor,
|
||||||
|
constraints: const BoxConstraints(),
|
||||||
|
onPressed: () async {
|
||||||
|
attachmentFiles.removeAt(index);
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
)
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
separatorBuilder: (cxt, index) => 6.height,
|
||||||
|
itemCount: attachmentFiles.length),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void getTicketTypes() async {
|
||||||
|
try {
|
||||||
|
Utils.showLoading(context);
|
||||||
|
getTicketTypesList = await MowadhafhiApiClient().getTicketTypes();
|
||||||
|
Utils.hideLoading(context);
|
||||||
|
getMowadhafhiProjects();
|
||||||
|
// setState(() {});
|
||||||
|
} catch (ex) {
|
||||||
|
Utils.hideLoading(context);
|
||||||
|
Utils.handleException(ex, context, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void getMowadhafhiProjects() async {
|
||||||
|
try {
|
||||||
|
Utils.showLoading(context);
|
||||||
|
getMowadhafhiProjectsList = await MowadhafhiApiClient().getProjects();
|
||||||
|
Utils.hideLoading(context);
|
||||||
|
getProjectDepartments(getMowadhafhiProjectsList[0].projectId!);
|
||||||
|
projectID = getMowadhafhiProjectsList[0].projectId!;
|
||||||
|
} catch (ex) {
|
||||||
|
Utils.hideLoading(context);
|
||||||
|
Utils.handleException(ex, context, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void getProjectDepartments(int projectID) async {
|
||||||
|
try {
|
||||||
|
Utils.showLoading(context);
|
||||||
|
getProjectDepartmentsList = await MowadhafhiApiClient().getProjectDepartments(projectID);
|
||||||
|
Utils.hideLoading(context);
|
||||||
|
setState(() {});
|
||||||
|
} catch (ex) {
|
||||||
|
Utils.hideLoading(context);
|
||||||
|
Utils.handleException(ex, context, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void getDepartmentSections(int? projectDepartmentID) async {
|
||||||
|
try {
|
||||||
|
Utils.showLoading(context);
|
||||||
|
getDepartmentSectionsList = await MowadhafhiApiClient().getDepartmentSections(projectDepartmentID);
|
||||||
|
Utils.hideLoading(context);
|
||||||
|
setState(() {});
|
||||||
|
} catch (ex) {
|
||||||
|
Utils.hideLoading(context);
|
||||||
|
Utils.handleException(ex, context, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void getSectionTopics(int? departmentSectionID) async {
|
||||||
|
try {
|
||||||
|
Utils.showLoading(context);
|
||||||
|
getSectionTopicsList = await MowadhafhiApiClient().getSectionTopics(departmentSectionID);
|
||||||
|
Utils.hideLoading(context);
|
||||||
|
setState(() {});
|
||||||
|
} catch (ex) {
|
||||||
|
Utils.hideLoading(context);
|
||||||
|
Utils.handleException(ex, context, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void submitHRRequest() async {
|
||||||
|
try {
|
||||||
|
Utils.showLoading(context);
|
||||||
|
List<Map<String, dynamic>> list = [];
|
||||||
|
if (attachmentFiles.isNotEmpty) {
|
||||||
|
for (int i = 0; i < attachmentFiles.length; i++) {
|
||||||
|
String type = attachmentFiles[i].path.split('.').last;
|
||||||
|
String name = attachmentFiles[i].path.split('/').last;
|
||||||
|
List<int> fileContent = await attachmentFiles[i].readAsBytes();
|
||||||
|
String encodedFile = base64Encode(fileContent);
|
||||||
|
list.add(MowadhafhiRequestAttachment(
|
||||||
|
contentType: "image/" + type,
|
||||||
|
fileName: name,
|
||||||
|
base64Data: encodedFile,
|
||||||
|
).toJson());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int? messageStatus = await MowadhafhiApiClient().submitRequest(selectedDepartment?.projectDepartmentId, description, projectID, selectedSection?.departmentSectionId.toString(),
|
||||||
|
selectedTopic?.sectionTopicId.toString(), int.parse(selectedServiceType), list);
|
||||||
|
Utils.showToast("Request created successfully");
|
||||||
|
Utils.hideLoading(context);
|
||||||
|
Navigator.pop(context);
|
||||||
|
} catch (ex) {
|
||||||
|
Utils.hideLoading(context);
|
||||||
|
Utils.handleException(ex, context, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,213 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:mohem_flutter_app/api/mowadhafhi/mowadhafhi_api_client.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/colors.dart';
|
||||||
|
import 'package:mohem_flutter_app/classes/utils.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_details.dart';
|
||||||
|
import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_transactions.dart';
|
||||||
|
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
|
||||||
|
|
||||||
|
class MowadhafhiRequestDetails extends StatefulWidget {
|
||||||
|
const MowadhafhiRequestDetails({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_RequestDetailsState createState() => _RequestDetailsState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _RequestDetailsState extends State<MowadhafhiRequestDetails> {
|
||||||
|
String? itgTicketID;
|
||||||
|
List<GetTicketDetailsByEmployee> getTicketsByEmployeeList = [];
|
||||||
|
List<GetTicketTransactions> getTicketTransactionsList = [];
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
// TODO: implement initState
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
getRequestID() {
|
||||||
|
if (itgTicketID == null) {
|
||||||
|
itgTicketID = ModalRoute.of(context)?.settings.arguments as String;
|
||||||
|
debugPrint(itgTicketID);
|
||||||
|
getTicketDetails();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
getRequestID();
|
||||||
|
return Scaffold(
|
||||||
|
backgroundColor: Colors.white,
|
||||||
|
appBar: AppBarWidget(
|
||||||
|
context,
|
||||||
|
title: "Mowadhafhi Request",
|
||||||
|
),
|
||||||
|
body: SingleChildScrollView(
|
||||||
|
child: getTicketsByEmployeeList.length != 0
|
||||||
|
? Column(
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
width: double.infinity,
|
||||||
|
padding: const EdgeInsets.only(left: 12, right: 12, top: 12, bottom: 12),
|
||||||
|
margin: const EdgeInsets.only(left: 12, right: 12, top: 12, bottom: 12),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.circular(10),
|
||||||
|
boxShadow: [
|
||||||
|
BoxShadow(
|
||||||
|
color: const Color(0xff000000).withOpacity(.05),
|
||||||
|
blurRadius: 26,
|
||||||
|
offset: const Offset(0, -3),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
getTicketsByEmployeeList![0].ticketStatusName!.toText14(color: MyColors.gradiantEndColor),
|
||||||
|
getTicketsByEmployeeList![0].created!.split(" ")[0].toText12(color: MyColors.grey70Color),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
8.height,
|
||||||
|
"Ticket Reference: ".toText12(color: MyColors.grey98Color),
|
||||||
|
getTicketsByEmployeeList![0].ticketReferenceNo!.toText14(color: MyColors.grey57Color),
|
||||||
|
8.height,
|
||||||
|
"Section: ".toText12(color: MyColors.grey98Color),
|
||||||
|
getTicketsByEmployeeList![0].sectionName!.toText14(color: MyColors.grey57Color),
|
||||||
|
8.height,
|
||||||
|
"Topic: ".toText12(color: MyColors.grey98Color),
|
||||||
|
getTicketsByEmployeeList![0].topicName!.toText14(color: MyColors.grey57Color),
|
||||||
|
8.height,
|
||||||
|
"Description: ".toText12(color: MyColors.grey98Color),
|
||||||
|
getTicketsByEmployeeList![0].description!.toText14(color: MyColors.grey57Color),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
width: double.infinity,
|
||||||
|
padding: const EdgeInsets.only(left: 12, right: 12, top: 12, bottom: 12),
|
||||||
|
margin: const EdgeInsets.only(left: 12, right: 12, top: 12, bottom: 12),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
borderRadius: BorderRadius.circular(10),
|
||||||
|
boxShadow: [
|
||||||
|
BoxShadow(
|
||||||
|
color: const Color(0xff000000).withOpacity(.05),
|
||||||
|
blurRadius: 26,
|
||||||
|
offset: const Offset(0, -3),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
ListView.builder(
|
||||||
|
shrinkWrap: true,
|
||||||
|
physics: const ScrollPhysics(),
|
||||||
|
itemBuilder: (BuildContext context, int index) {
|
||||||
|
return Stack(
|
||||||
|
children: <Widget>[
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(left: 50.0),
|
||||||
|
child: Card(
|
||||||
|
elevation: 0.0,
|
||||||
|
margin: const EdgeInsets.fromLTRB(0.0, 20.0, 20.0, 10.0),
|
||||||
|
child: Container(
|
||||||
|
padding: const EdgeInsets.all(12.0),
|
||||||
|
width: double.infinity,
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
"Action By: ".toText14(color: MyColors.grey57Color),
|
||||||
|
getTicketTransactionsList![index].actionBy!.toText14(color: MyColors.grey57Color),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
getTicketTransactionsList![index].comments!.toText14(color: MyColors.grey98Color),
|
||||||
|
12.height,
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
|
children: [
|
||||||
|
getTicketTransactionsList![0].actionDate!.split(" ")[0].toText12(color: MyColors.grey70Color),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Positioned(
|
||||||
|
top: 0.0,
|
||||||
|
bottom: 0.0,
|
||||||
|
left: 28.0,
|
||||||
|
child: Container(
|
||||||
|
height: double.infinity,
|
||||||
|
width: 3.0,
|
||||||
|
color: MyColors.lightTextColor.withOpacity(0.5),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Positioned(
|
||||||
|
top: 0.0,
|
||||||
|
left: 15.0,
|
||||||
|
child: Container(
|
||||||
|
height: 30.0,
|
||||||
|
width: 30.0,
|
||||||
|
decoration: const BoxDecoration(
|
||||||
|
shape: BoxShape.circle,
|
||||||
|
color: Colors.white,
|
||||||
|
),
|
||||||
|
child: Container(
|
||||||
|
margin: const EdgeInsets.all(5.0),
|
||||||
|
height: 30.0,
|
||||||
|
width: 30.0,
|
||||||
|
decoration: const BoxDecoration(shape: BoxShape.circle, color: MyColors.gradiantEndColor),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
itemCount: getTicketTransactionsList.length ?? 0,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
: Container(),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void getTicketDetails() async {
|
||||||
|
try {
|
||||||
|
Utils.showLoading(context);
|
||||||
|
getTicketsByEmployeeList = await MowadhafhiApiClient().getTicketDetailsByEmployee(itgTicketID);
|
||||||
|
Utils.hideLoading(context);
|
||||||
|
setState(() {});
|
||||||
|
getTicketTransactions();
|
||||||
|
} catch (ex) {
|
||||||
|
Utils.hideLoading(context);
|
||||||
|
Utils.handleException(ex, context, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void getTicketTransactions() async {
|
||||||
|
try {
|
||||||
|
Utils.showLoading(context);
|
||||||
|
getTicketTransactionsList = await MowadhafhiApiClient().getTicketTransactions(itgTicketID);
|
||||||
|
debugPrint(getTicketTransactionsList![0].actionDate);
|
||||||
|
Utils.hideLoading(context);
|
||||||
|
setState(() {});
|
||||||
|
} catch (ex) {
|
||||||
|
Utils.hideLoading(context);
|
||||||
|
Utils.handleException(ex, context, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue