A software product designed to automate business processes, as well as the processes of various service organizations: IT services, call centers, client departments, project offices and other divisions of companies.
The point of Service Desk existence is to promptly troubleshoot problems reported by users and restore the optimal level of service.
Table 1 - Global Variables Used in the Program
Name | Type | Description |
CurrentLang | Text | The language selected by the user |
CurrentUser | Text | Username |
IsAdmin | Boolean | Whether the user is an administrator |
EditRecord | Record | Intermediate entity for transferring data of the selected request for its further editing |
Table 2 - Attributes of the AccountNameTypes collection
Attribute | Description |
AccountNameTypes | Department name |
Table 3 - Attributes of the Attendants collection
Attribute | Description |
Name | Name of employee |
Department | Employee's department |
Table 4 - Attributes of the CaseStatus collection
Attribute | Description |
StatusCase | Possible request statuses |
Table 5 - Attributes of the PriorityTypes collection
Attribute | Description |
PriorityTypes | Possible types of order priority |
Table 6 - Attributes of the Tickets collection
Attribute | Description |
ID | Application identifier |
Owner | Customer name |
Priority | Requisition priority |
Status | Order status |
Subject | Subject of the request |
Description | Description of the order |
Comment | Comment to the request |
DateCreated | Creation date of the request |
DateClosed | Closing date of the request |
AssignedTo | Executor of the request |
AccountName | Executor's department |
The first screen the user sees is the login screen, which offers to log in as a regular user or as an administrator. The difference between these two entities is the filtering of requests relative to the user. The administrator can edit all current requests; the user can only see requests where he acts as a performer.
Also support of three languages is realized in the application: English, Spanish and Russian.
This functionality is implemented through connection to MicrosoftTranslator. When you click on the flag corresponding to the language, the CurrentLang variable changes. For example, when you click on the Spanish flag, the function:
Set(CurrentLang; "es").
This, in turn, will change the text of all text fields except for the filter gallery fields. For example, the text of the application subject field is implemented like this:
MicrosoftTranslator.Translate(ThisItem.Subject;CurrentLang)
It is also worth noting that at the moment the separator in the functions is a semicolon, although in the documentation to PowerApps the separator is a comma, hence the examples from there are not working.
Interface when English is selected:
The main screen for the administrator is a list of all requests (Figure 1). In the upper left corner there are two icons: exit and filter display.
When you click on the exit icon, you will go to the authorization window through the Navigate(LoginScreen;ScreenTransition.None) function.
Clicking the filter icon opens/closes the filter menu. When the menu is active, the icon is colored.
The request list is a collection, consisting of groups of elements (request ID, customer, priority, etc.)
Filtering is implemented in the "Items" property of TicketsGallery:
Filter(TicketsCollect;StartsWith(Subject;FilterInput.Text) &&
(Status = RadioStatus.SelectedText.Value || RadioStatus.SelectedText.Value = Blank()) &&
(AssignedTo = DropdownNames.SelectedText.Value || DropdownNames.SelectedText.Value))
There is also a reset icon in the filter menu which, when clicked, will do the following:
Reset(RadioStatus);;Reset(FilterInput);;Reset(DropdownNames);;
The main screen for the user is similar to the administrator interface, except for one feature: the filter field "Executor" is filled with the name of the current user and is not available for change, therefore, he is available requests, where he is listed as an executor.
When you click on any of the applications from the list, you will be taken to a page with detailed information
This transition is implemented by using the "Navigate" command, and before the transition an intermediate entity is created that stores the current (not yet changed) state of the request:
Set(EditRecord; ThisItem);;
Navigate(TicketdetailsPage;ScreenTransition.Fade;{
type:ThisItem.Status;
assign:ThisItem.AssignedTo;
Area:ThisItem.AccountName;
priority:ThisItem.Priority;
})
On the page with detailed description of the request the user can change only its status. When saving the changes, it is checked if the status of the request has been changed to "Closed" if yes, then the closing date is the current day:
If(EditStatus_tb.Text<>"Closed";
UpdateIf(TicketsCollect;ID=EditRecord.ID;{
Status:EditStatus_tb.Text;
AssignedTo:assign;
DateClosed:Today();
AccountName:EditArea_tb.Text;
Priority:EditPriority_tb.Text;
Subject:Subject_tb.Text;
Description:Desc_tb.Text;
Comment:Comment_tb.Text.
});
UpdateIf(TicketsCollect;ID=EditRecord.ID;{
Status:EditStatus_tb.Text;
AssignedTo:assign;
DateClosed:TextBox3;
AccountName:EditArea_tb.Text;
Priority:EditPriority_tb.Text;
Subject:Subject_tb.Text;
Description:Desc_tb.Text;
Comment:Comment_tb.Text});;
Navigate(DashboardPage;ScreenTransition.Fade)
The administrator can also change the Department, Executor, and Priority fields. In the course of work, a cascading approach was implemented for the fields "Department" and "Executor". This means that when selecting a department as a result of filtering, only performers assigned to this department will remain for selection
Also on the main page, when you click the icon "+", you will go to a window where you can create a new application
As you can see from the figure, some fields are marked with an asterisk, which means that they must be filled in. If one or more of these fields will not be filled, an error message appears at the bottom
This check is included in the logic of the button of request creation. It is also implemented to collect data for its further saving in the request collection:
If(CreatedBy.Text="" ||
Dropdown_Priority.SelectedText.Value = "Select Priority" ||
DepartmentListNew.SelectedText.Value = "Select Department" ||
AssignedListNew.SelectedText.Value = "Select Executor" ||
Subject.Text=";
UpdateContext({msg_visible:false});;
UpdateContext({msg_visible:true});
Collect(TicketsCollect1;{
ID:Text(CountRows(TicketsCollect1)+1);
Owner:CreatedBy.Text;
AccountName:AssignedListNew.SelectedText.Value;
Priority:Dropdown_Priority.SelectedText.Value;
Subject:Subject.Text;
Description:Description.Text;
Status: "In progress"; DateCreated:Text(Today())});;
Navigate(DashboardPage; ScreenTransition.None))