Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions Prototyping/EnumExt50110.PVSCopilotCapabilities.al
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
enumextension 50110 "PVS Ticket Classifier Capability" extends "Copilot Capability"
{
value(50110; "PVS Ticket Classifier")
{
Caption = 'PrintVis Ticket Classifier';
}
}
59 changes: 59 additions & 0 deletions Prototyping/PVSSupportTools.Page.al
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/// <summary>
/// Standalone support tools page. Provides a central entry point for Copilot-assisted
/// support features when no suitable PrintVis Role Center is available to extend.
/// </summary>
page 50112 "PVS Support Tools"
{
PageType = Card;
Caption = 'PVS Support Tools';
ApplicationArea = All;

layout
{
area(Content)
{
group(CopilotGroup)
{
Caption = 'Copilot Features';
InstructionalText = 'Use the actions below to access AI-powered support tools for PrintVis.';
}
}
}

actions
{
area(Processing)
{
group(SupportGroup)
{
Caption = 'Support';

action(ClassifyTicket)
{
ApplicationArea = All;
Caption = 'Classify Support Ticket';
Image = Sparkle;
ToolTip = 'Paste a support ticket description and let AI classify it into a standard PrintVis category.';

trigger OnAction()
begin
Page.RunModal(Page::"PVS Ticket Classifier");
end;
}
action(ViewLog)
{
ApplicationArea = All;
Caption = 'View Classification Log';
Image = Log;
ToolTip = 'View all previously classified support tickets.';
RunObject = Page "PVS Ticket Classification Log";
}
}
}
area(Promoted)
{
actionref(ClassifyTicket_Promoted; ClassifyTicket) { }
actionref(ViewLog_Promoted; ViewLog) { }
}
}
}
44 changes: 44 additions & 0 deletions Prototyping/PVSTicketCategory.Enum.al
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/// <summary>
/// Defines the standard classification categories for PrintVis support tickets.
/// </summary>
enum 50110 "PVS Ticket Category"
{
Extensible = false;

value(0; Issue)
{
Caption = 'Issue';
}
value(1; HowTo)
{
Caption = 'How To';
}
value(2; EventRequest)
{
Caption = 'Event Request';
}
value(3; Idea)
{
Caption = 'Idea';
}
value(4; License)
{
Caption = 'License';
}
value(5; BCRelated)
{
Caption = 'BC-Related';
}
value(6; TechnicalQuestion)
{
Caption = 'Technical Question';
}
value(7; ResourceRequest)
{
Caption = 'Resource Request';
}
value(8; Other)
{
Caption = 'Other';
}
}
56 changes: 56 additions & 0 deletions Prototyping/PVSTicketClassification.Table.al
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/// <summary>
/// Stores the log of AI-classified support tickets.
/// </summary>
table 50110 "PVS Ticket Classification"
{
Caption = 'PVS Ticket Classification';
DataClassification = CustomerContent;

fields
{
field(1; "Entry No."; Integer)
{
Caption = 'Entry No.';
AutoIncrement = true;
}
field(2; "Ticket Text"; Blob)
{
Caption = 'Ticket Text';
DataClassification = CustomerContent;
}
field(3; Category; Enum "PVS Ticket Category")
{
Caption = 'Category';
}
field(4; Confidence; Integer)
{
Caption = 'Confidence';
MinValue = 0;
MaxValue = 100;
}
field(5; Rationale; Text[2048])
{
Caption = 'Rationale';
}
field(6; "Suggested Action"; Text[1024])
{
Caption = 'Suggested Action';
}
field(7; "Classified At"; DateTime)
{
Caption = 'Classified At';
}
field(8; "Classified By"; Code[50])
{
Caption = 'Classified By';
}
}

keys
{
key(PK; "Entry No.")
{
Clustered = true;
}
}
}
98 changes: 98 additions & 0 deletions Prototyping/PVSTicketClassificationLog.Page.al
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
/// <summary>
/// Displays the log of all AI-classified support tickets.
/// </summary>
page 50111 "PVS Ticket Classification Log"
{
PageType = List;
Caption = 'Ticket Classification Log';
ApplicationArea = All;
SourceTable = "PVS Ticket Classification";
Editable = false;
InsertAllowed = false;
ModifyAllowed = false;

layout
{
area(Content)
{
repeater(LogLines)
{
field("Entry No."; Rec."Entry No.")
{
ApplicationArea = All;
ToolTip = 'The sequential log entry number.';
}
field(Category; Rec.Category)
{
ApplicationArea = All;
StyleExpr = CategoryStyle;
ToolTip = 'The ticket category assigned by the AI classifier.';
}
field(Confidence; Rec.Confidence)
{
ApplicationArea = All;
Caption = 'Confidence (%)';
ToolTip = 'How confident the AI was in the classification (0–100).';
}
field(Rationale; Rec.Rationale)
{
ApplicationArea = All;
ToolTip = 'Brief explanation of why the AI chose this category.';
}
field("Suggested Action"; Rec."Suggested Action")
{
ApplicationArea = All;
ToolTip = 'Recommended next step for this ticket.';
}
field("Classified At"; Rec."Classified At")
{
ApplicationArea = All;
ToolTip = 'Date and time when the ticket was classified.';
}
field("Classified By"; Rec."Classified By")
{
ApplicationArea = All;
ToolTip = 'The user who classified the ticket.';
}
}
}
}

actions
{
area(Processing)
{
action(OpenClassifier)
{
ApplicationArea = All;
Caption = 'Open Classifier';
Image = Sparkle;
ToolTip = 'Open the ticket classifier to classify a new support ticket.';

trigger OnAction()
begin
Page.RunModal(Page::"PVS Ticket Classifier");
end;
}
}
area(Promoted)
{
actionref(OpenClassifier_Promoted; OpenClassifier) { }
}
}

trigger OnAfterGetRecord()
begin
UpdateCategoryStyle();
end;

local procedure UpdateCategoryStyle()
var
TicketClassifierAI: Codeunit "PVS Ticket Classifier AI";
begin
CategoryStyle := TicketClassifierAI.GetCategoryStyle(Rec.Category);
end;

var
CategoryStyle: Text;
}
Loading
Loading