// Customer Feedback Table table 50100 "Customer Feedback" { DataClassification = CustomerContent; fields { field(1; "Feedback ID"; Integer) { Caption = 'Feedback ID'; AutoIncrement = true; } field(2; "Customer No."; Code[20]) { Caption = 'Customer No.'; TableRelation = Customer; trigger OnValidate() var Customer: Record Customer; begin if Customer.Get("Customer No.") then "Customer Name" := Customer.Name; end; } field(3; "Customer Name"; Text[100]) { Caption = 'Customer Name'; Editable = false; } field(4; "Order No."; Code[20]) { Caption = 'Order No.'; TableRelation = "Sales Header"."No." where("Document Type" = const(Order)); } field(5; Rating; Integer) { Caption = 'Rating'; MinValue = 1; MaxValue = 5; } field(6; Comments; Text[250]) { Caption = 'Comments'; } field(7; "Feedback Date"; Date) { Caption = 'Feedback Date'; trigger OnValidate() begin if "Feedback Date" = 0D then "Feedback Date" := Today; end; } } keys { key(PK; "Feedback ID") { Clustered = true; } key(CustomerKey; "Customer No.") { } key(OrderKey; "Order No.") { } } } // Customer Feedback List Page page 50100 "Customer Feedback List" { PageType = List; SourceTable = "Customer Feedback"; Caption = 'Customer Feedback List'; UsageCategory = Lists; ApplicationArea = All; layout { area(Content) { repeater(Group) { field("Feedback ID"; Rec."Feedback ID") { ApplicationArea = All; } field("Customer No."; Rec."Customer No.") { ApplicationArea = All; } field("Customer Name"; Rec."Customer Name") { ApplicationArea = All; } field("Order No."; Rec."Order No.") { ApplicationArea = All; } field(Rating; Rec.Rating) { ApplicationArea = All; } field(Comments; Rec.Comments) { ApplicationArea = All; } field("Feedback Date"; Rec."Feedback Date") { ApplicationArea = All; } } } } } // Sales Header Table Extension tableextension 50100 "Sales Header Extension" extends "Sales Header" { fields { field(50100; "Has Feedback"; Boolean) { Caption = 'Has Feedback'; FieldClass = FlowField; CalcFormula = exist("Customer Feedback" where("Order No." = field("No."))); Editable = false; } } } // Sales Order Page Extension pageextension 50100 "Sales Order Extension" extends "Sales Order" { layout { addafter("Work Description") { field("Has Feedback"; Rec."Has Feedback") { ApplicationArea = All; Editable = false; } } } } // Event Subscriber Codeunit codeunit 50100 "Feedback Event Subscriber" { [EventSubscriber(ObjectType::Codeunit, Codeunit::"Sales-Post", 'OnAfterPostSalesDoc', '', true, true)] local procedure CheckFeedbackOnPost(var SalesHeader: Record "Sales Header") var CustomerFeedback: Record "Customer Feedback"; NotificationMsg: Notification; begin if not CustomerFeedback.Get(SalesHeader."No.") then begin NotificationMsg.Message := StrSubstNo('No feedback recorded for order %1', SalesHeader."No."); NotificationMsg.Send(); end; end; } // Customer Feedback API Page page 50101 "Customer Feedback API" { PageType = API; Caption = 'Customer Feedback API'; APIPublisher = 'publisher'; APIGroup = 'feedback'; APIVersion = 'v1.0'; EntityName = 'customerFeedback'; EntitySetName = 'customerFeedbacks'; SourceTable = "Customer Feedback"; DelayedInsert = true; layout { area(Content) { repeater(Group) { field(feedbackId; Rec."Feedback ID") { } field(customerNo; Rec."Customer No.") { } field(orderNo; Rec."Order No.") { } field(rating; Rec.Rating) { } field(comments; Rec.Comments) { } field(feedbackDate; Rec."Feedback Date") { } } } } } // Customer Feedback Summary Report report 50100 "Customer Feedback Summary" { UsageCategory = ReportsAndAnalysis; ApplicationArea = All; DefaultLayout = RDLC; dataset { dataitem(Customer; Customer) { column(CustomerNo; "No.") { } column(CustomerName; Name) { } column(TotalFeedback; TotalFeedback) { } column(AverageRating; AverageRating) { } trigger OnAfterGetRecord() var CustomerFeedback: Record "Customer Feedback"; TotalRating: Decimal; begin CustomerFeedback.SetRange("Customer No.", "No."); TotalFeedback := CustomerFeedback.Count; if TotalFeedback > 0 then begin CustomerFeedback.CalcSums(Rating); AverageRating := CustomerFeedback.Rating / TotalFeedback; end; end; } } requestpage { layout { area(Content) { group(DateFilter) { field(StartDate; StartDate) { Caption = 'Start Date'; ApplicationArea = All; } field(EndDate; EndDate) { Caption = 'End Date'; ApplicationArea = All; } } } } } var StartDate: Date; EndDate: Date; TotalFeedback: Integer; AverageRating: Decimal; } // Feedback Reminder Codeunit codeunit 50101 "Customer Feedback Reminder" { trigger OnRun() begin SendFeedbackReminders(); end; local procedure SendFeedbackReminders() var SalesHeader: Record "Sales Header"; Customer: Record Customer; CustomerFeedback: Record "Customer Feedback"; EmailMessage: Codeunit "Email Message"; Email: Codeunit Email; begin SalesHeader.SetRange("Document Type", SalesHeader."Document Type"::Order); SalesHeader.SetRange(Status, SalesHeader.Status::Released); if SalesHeader.FindSet() then repeat if not CustomerFeedback.Get(SalesHeader."No.") then if Customer.Get(SalesHeader."Sell-to Customer No.") then if Customer."E-Mail" <> '' then begin EmailMessage.Create( Customer."E-Mail", 'Feedback Request - Order ' + SalesHeader."No.", CreateEmailBody(SalesHeader."No."), true ); Email.Send(EmailMessage); end; until SalesHeader.Next() = 0; end; local procedure CreateEmailBody(OrderNo: Code[20]): Text begin exit(StrSubstNo('Please provide feedback for your recent order %1.\n\n' + 'Your feedback helps us improve our services.\n\n' + 'Thank you for your business.', OrderNo)); end; }