From 2aefd0dbeec29c4163e7ab11a925a7145c8cfa9f Mon Sep 17 00:00:00 2001 From: Dmitry Katson Date: Sun, 15 Sep 2024 12:04:35 +0700 Subject: [PATCH 1/7] Refactor Existing No. Series Handling and Implement Tool Enhancements Enhanced handling of existing number series configuration and introduced improvements to the tool logic for generating number series. This change streamlines the process and ensures accurate handling of existing configurations. It also introduces functionality to manage existing number series effectively. --- .../Copilot/NoSeriesCopilotImpl.Codeunit.al | 25 ++++++++--- .../Copilot/NoSeriesGenerationDetail.Table.al | 8 ++++ .../src/Copilot/NoSeriesGenerationSub.Page.al | 22 ++++++++++ .../Tools/NoSeriesCopAddIntent.Codeunit.al | 42 ++++++++++++++++++- 4 files changed, 90 insertions(+), 7 deletions(-) diff --git a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesCopilotImpl.Codeunit.al b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesCopilotImpl.Codeunit.al index a6598918ab..85dee2a19e 100644 --- a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesCopilotImpl.Codeunit.al +++ b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesCopilotImpl.Codeunit.al @@ -19,6 +19,7 @@ codeunit 324 "No. Series Copilot Impl." var IncorrectCompletionErr: Label 'Incorrect completion. The property %1 is empty', Comment = '%1 = property name'; + EmptyCompletionErr: Label 'Incorrect completion. The completion is empty'; IncorrectCompletionNumberOfGeneratedNoSeriesErr: Label 'Incorrect completion. The number of generated number series is incorrect. Expected %1, but got %2', Comment = '%1 = Expected Number, %2 = Actual Number'; TextLengthIsOverMaxLimitErr: Label 'The property %1 exceeds the maximum length of %2', Comment = '%1 = property name, %2 = maximum length'; DateSpecificPlaceholderLbl: Label '{current_date}', Locked = true; @@ -68,6 +69,7 @@ codeunit 324 "No. Series Copilot Impl." procedure ApplyGeneratedNoSeries(var GeneratedNoSeries: Record "No. Series Generation Detail") begin + GeneratedNoSeries.SetRange(Exists, false); if GeneratedNoSeries.FindSet() then repeat InsertNoSeriesWithLines(GeneratedNoSeries); @@ -189,13 +191,13 @@ codeunit 324 "No. Series Copilot Impl." CompletionAnswerTxt := AOAIChatMessages.GetLastMessage(); // the model can answer to rephrase the question, if the user input is not clear if AOAIOperationResponse.IsFunctionCall() then - CompletionAnswerTxt := GenerateNoSeriesUsingToolResult(AzureOpenAI, InputText, AOAIOperationResponse); + CompletionAnswerTxt := GenerateNoSeriesUsingToolResult(AzureOpenAI, InputText, AOAIOperationResponse, AddNoSeriesIntent.GetExistingNoSeries()); exit(CompletionAnswerTxt); end; [NonDebuggable] - local procedure GenerateNoSeriesUsingToolResult(var AzureOpenAI: Codeunit "Azure OpenAI"; InputText: Text; var AOAIOperationResponse: Codeunit "AOAI Operation Response"): Text + local procedure GenerateNoSeriesUsingToolResult(var AzureOpenAI: Codeunit "Azure OpenAI"; InputText: Text; var AOAIOperationResponse: Codeunit "AOAI Operation Response"; ExistingNoSeriesArray: Text): Text var AOAIChatCompletionParams: Codeunit "AOAI Chat Completion Params"; AOAIChatMessages: Codeunit "AOAI Chat Messages"; @@ -236,10 +238,12 @@ codeunit 324 "No. Series Copilot Impl." Clear(AOAIChatMessages); Progress.Close(); end; - end; - exit(ConcatenateToolResponse(FinalResults)); - end; + if ExistingNoSeriesArray <> '' then + FinalResults.Add(ExistingNoSeriesArray); + + exit(ConcatenateToolResponse(FinalResults)); + end; [NonDebuggable] local procedure GetExpectedNoSeriesCount(ToolResponse: Dictionary of [Text, Integer]; Message: Text) ExpectedNoSeriesCount: Integer @@ -337,6 +341,7 @@ codeunit 324 "No. Series Copilot Impl." begin ReadGeneratedNumberSeriesJArray(GeneratedNoSeriesArrayText).WriteTo(NoSeriesArrText); Json.InitializeCollection(NoSeriesArrText); + CheckIfArrayIsNotEmpty(Json.GetCollectionCount()); for i := 0 to Json.GetCollectionCount() - 1 do begin Json.GetObjectFromCollectionByIndex(i, NoSeriesObj); @@ -356,6 +361,12 @@ codeunit 324 "No. Series Copilot Impl." end; end; + local procedure CheckIfArrayIsNotEmpty(NumberOfGeneratedNoSeries: Integer) + begin + if NumberOfGeneratedNoSeries = 0 then + Error(EmptyCompletionErr); + end; + local procedure CheckTextPropertyExistAndCheckIfNotEmpty(propertyName: Text; var Json: Codeunit Json) var value: Text; @@ -482,6 +493,8 @@ codeunit 324 "No. Series Copilot Impl." Json.GetValueAndSetToRecFieldNo(RecRef, 'tableId', GeneratedNoSeries.FieldNo("Setup Table No.")); Json.GetValueAndSetToRecFieldNo(RecRef, 'fieldId', GeneratedNoSeries.FieldNo("Setup Field No.")); Json.GetValueAndSetToRecFieldNo(RecRef, 'nextYear', GeneratedNoSeries.FieldNo("Is Next Year")); + Json.GetValueAndSetToRecFieldNo(RecRef, 'exists', GeneratedNoSeries.FieldNo(Exists)); + Json.GetValueAndSetToRecFieldNo(RecRef, 'message', GeneratedNoSeries.FieldNo(Message)); RecRef.Insert(true); ValidateGeneratedNoSeries(RecRef); @@ -528,7 +541,7 @@ codeunit 324 "No. Series Copilot Impl." local procedure MaxModelTokens(): Integer begin - exit(16385); //gpt-4o-mini-latest + exit(16385); //gpt-4o-latest end; procedure IsCopilotVisible(): Boolean diff --git a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesGenerationDetail.Table.al b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesGenerationDetail.Table.al index 59b13d0246..7f59e7b6da 100644 --- a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesGenerationDetail.Table.al +++ b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesGenerationDetail.Table.al @@ -76,6 +76,14 @@ table 392 "No. Series Generation Detail" { Caption = 'Starting Date'; } + field(13; "Exists"; Boolean) + { + Caption = 'Exists'; + } + field(14; Message; Text[1024]) + { + Caption = 'Message'; + } } keys diff --git a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesGenerationSub.Page.al b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesGenerationSub.Page.al index 2359753161..30c7272c50 100644 --- a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesGenerationSub.Page.al +++ b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesGenerationSub.Page.al @@ -28,41 +28,63 @@ page 333 "No. Series Generation Sub" { ApplicationArea = All; ToolTip = 'Specifies the value of the Series Code field.'; + Enabled = IsEnabled; } field(Description; Rec.Description) { ApplicationArea = All; ToolTip = 'Specifies the value of the Description field.'; + Enabled = IsEnabled; } field("Starting No."; Rec."Starting No.") { ApplicationArea = All; ToolTip = 'Specifies the value of the Starting No. field.'; + Enabled = IsEnabled; } field("Increment-by No."; Rec."Increment-by No.") { ApplicationArea = All; ToolTip = 'Specifies the value of the Increment-by No. field.'; + Enabled = IsEnabled; } field("Ending No."; Rec."Ending No.") { ApplicationArea = All; ToolTip = 'Specifies the value of the Ending No. field.'; + Enabled = IsEnabled; } field("Warning No."; Rec."Warning No.") { ApplicationArea = All; ToolTip = 'Specifies the value of the Warning No. field.'; + Enabled = IsEnabled; } field("Starting Date"; Rec."Starting Date") { ApplicationArea = All; ToolTip = 'Specifies the value of the Starting Date field.'; + Enabled = IsEnabled; + } + field(Message; Rec.Message) + { + ApplicationArea = All; + ToolTip = 'Specifies the value of the Message field.'; + Style = Attention; + Editable = false; } } } } + var + IsEnabled: Boolean; + + trigger OnAfterGetRecord() + begin + IsEnabled := not Rec.Exists; + end; + internal procedure Load(var GeneratedNoSeries: Record "No. Series Generation Detail") begin GeneratedNoSeries.Reset(); diff --git a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/Tools/NoSeriesCopAddIntent.Codeunit.al b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/Tools/NoSeriesCopAddIntent.Codeunit.al index d6b3aa66d7..d3d82e58f1 100644 --- a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/Tools/NoSeriesCopAddIntent.Codeunit.al +++ b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/Tools/NoSeriesCopAddIntent.Codeunit.al @@ -20,6 +20,7 @@ codeunit 331 "No. Series Cop. Add Intent" implements "AOAI Function" AzureKeyVault: Codeunit "Azure Key Vault"; Telemetry: Codeunit Telemetry; ToolsImpl: Codeunit "No. Series Cop. Tools Impl."; + ExistingNoSeriesJArr: JsonArray; FunctionNameLbl: Label 'CreateNewNumberSeries', Locked = true; DateSpecificPlaceholderLbl: Label '{current_date}', Locked = true; CustomPatternsPlaceholderLbl: Label '{custom_patterns}', Locked = true; @@ -28,6 +29,7 @@ codeunit 331 "No. Series Cop. Add Intent" implements "AOAI Function" TelemetryTool1PromptRetrievalErr: Label 'Unable to retrieve the prompt for No. Series Copilot Tool 1 from Azure Key Vault.', Locked = true; TelemetryTool1DefinitionRetrievalErr: Label 'Unable to retrieve the definition for No. Series Copilot Tool 1 from Azure Key Vault.', Locked = true; ToolLoadingErr: Label 'Unable to load the No. Series Copilot Tool 1. Please try again later.'; + ExistingNoSeriesMessageLbl: Label 'Number series already configured. If you wish to modify the existing series, please use the `Modify number series` prompt.'; procedure GetName(): Text begin @@ -148,8 +150,10 @@ codeunit 331 "No. Series Cop. Add Intent" implements "AOAI Function" exit; FieldRef := RecRef.Field(Field."No."); - if Format(FieldRef.Value) <> '' then + if Format(FieldRef.Value) <> '' then begin + SaveExistingNoSeries(TempTableMetadata, FieldRef); exit; // No need to generate number series if it already created and configured + end; TempSetupTable := TempTableMetadata; if TempSetupTable.Insert() then; @@ -158,6 +162,42 @@ codeunit 331 "No. Series Cop. Add Intent" implements "AOAI Function" TempNoSeriesField.Insert(); end; + local procedure SaveExistingNoSeries(TempTableMetadata: Record "Table Metadata" temporary; FieldRef: FieldRef) + var + ExistingNoSeriesJObj: JsonObject; + NoSeries: Record "No. Series"; + NoSeriesLine: Record "No. Series Line"; + NoSeriesManagement: Codeunit "No. Series"; + begin + if not NoSeries.Get(Format(FieldRef.Value)) then + exit; + + NoSeriesManagement.GetNoSeriesLine(NoSeriesLine, NoSeries.Code, Today(), false); + + Clear(ExistingNoSeriesJObj); + ExistingNoSeriesJObj.Add('seriesCode', NoSeries.Code); + ExistingNoSeriesJObj.Add('description', NoSeries.Description); + ExistingNoSeriesJObj.Add('startingNo', NoSeriesLine."Starting No."); + ExistingNoSeriesJObj.Add('endingNo', NoSeriesLine."Ending No."); + ExistingNoSeriesJObj.Add('warningNo', NoSeriesLine."Warning No."); + ExistingNoSeriesJObj.Add('incrementByNo', NoSeriesLine."Increment-by No."); + ExistingNoSeriesJObj.Add('tableId', TempTableMetadata.ID); + ExistingNoSeriesJObj.Add('fieldId', FieldRef.Number); + ExistingNoSeriesJObj.Add('nextYear', false); + ExistingNoSeriesJObj.Add('exists', true); + ExistingNoSeriesJObj.Add('message', ExistingNoSeriesMessageLbl); + + ExistingNoSeriesJArr.Add(ExistingNoSeriesJObj); + end; + + procedure GetExistingNoSeries() ExistingNoSeries: Text + begin + if ExistingNoSeriesJArr.Count() = 0 then + exit(''); + + ExistingNoSeriesJArr.WriteTo(ExistingNoSeries); + end; + [NonDebuggable] local procedure GetToolPrompt() Prompt: Text begin From 1c0d5a25f57bd84b8a6304641d193ee6f1f89d5a Mon Sep 17 00:00:00 2001 From: Dmitry Katson Date: Tue, 17 Sep 2024 11:21:15 +0700 Subject: [PATCH 2/7] Refactor code for adding and processing NoSeries data accurately Consolidated code related to handling and updating NoSeries data for improved accuracy. Refactored methods for better efficiency and clarity while adding new functionality to process NoSeries codes in collection. Adjusted string nearness calculation parameters for enhanced matching reliability. --- .../Copilot/NoSeriesCopilotImpl.Codeunit.al | 41 +++++++++++-------- .../Copilot/NoSeriesGenerationDetail.Table.al | 15 +++++++ .../src/Copilot/NoSeriesGenerationSub.Page.al | 13 ++++++ .../Tools/NoSeriesCopToolsImpl.Codeunit.al | 7 +++- 4 files changed, 59 insertions(+), 17 deletions(-) diff --git a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesCopilotImpl.Codeunit.al b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesCopilotImpl.Codeunit.al index 85dee2a19e..f52fb31bb5 100644 --- a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesCopilotImpl.Codeunit.al +++ b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesCopilotImpl.Codeunit.al @@ -211,6 +211,9 @@ codeunit 324 "No. Series Copilot Impl." FunctionResponses: List of [Codeunit "AOAI Function Response"]; Progress: Dialog; begin + if ExistingNoSeriesArray <> '' then + FinalResults.Add(ExistingNoSeriesArray); + FunctionResponses := AOAIOperationResponse.GetFunctionResponses(); foreach AOAIFunctionResponse in FunctionResponses do begin @@ -238,12 +241,9 @@ codeunit 324 "No. Series Copilot Impl." Clear(AOAIChatMessages); Progress.Close(); end; - - if ExistingNoSeriesArray <> '' then - FinalResults.Add(ExistingNoSeriesArray); - - exit(ConcatenateToolResponse(FinalResults)); end; + exit(ConcatenateToolResponse(FinalResults)); + end; [NonDebuggable] local procedure GetExpectedNoSeriesCount(ToolResponse: Dictionary of [Text, Integer]; Message: Text) ExpectedNoSeriesCount: Integer @@ -431,27 +431,36 @@ codeunit 324 "No. Series Copilot Impl." var Json: Codeunit Json; i: Integer; - NoSeriesObj: Text; NoSeriesCodes: List of [Text]; - NoSeriesCode: Text; begin Json.InitializeCollection(NoSeriesArrText); for i := 0 to Json.GetCollectionCount() - 1 do begin - Json.GetObjectFromCollectionByIndex(i, NoSeriesObj); - Json.InitializeObject(NoSeriesObj); - Json.GetStringPropertyValueByName('seriesCode', NoSeriesCode); - if NoSeriesCodes.Contains(NoSeriesCode) then begin - Json.ReplaceOrAddJPropertyInJObject('seriesCode', GenerateNewSeriesCodeValue(NoSeriesCodes, NoSeriesCode)); - NoSeriesObj := Json.GetObjectAsText(); - Json.ReplaceJObjectInCollection(i, NoSeriesObj); - end; - NoSeriesCodes.Add(NoSeriesCode); + ProcessNoSeries(i, NoSeriesCodes, Json); end; NoSeriesArrText := Json.GetCollectionAsText() end; + local procedure ProcessNoSeries(i: Integer; var NoSeriesCodes: List of [Text]; var Json: Codeunit Json) + var + NoSeriesCode: Text; + NoSeriesObj: Text; + IsExists: Boolean; + begin + Json.GetObjectFromCollectionByIndex(i, NoSeriesObj); + Json.InitializeObject(NoSeriesObj); + Json.GetBoolPropertyValueFromJObjectByName('exists', IsExists); + Json.GetStringPropertyValueByName('seriesCode', NoSeriesCode); + + if NoSeriesCodes.Contains(NoSeriesCode) and (not IsExists) then begin + Json.ReplaceOrAddJPropertyInJObject('seriesCode', GenerateNewSeriesCodeValue(NoSeriesCodes, NoSeriesCode)); + NoSeriesObj := Json.GetObjectAsText(); + Json.ReplaceJObjectInCollection(i, NoSeriesObj); + end; + NoSeriesCodes.Add(NoSeriesCode); + end; + local procedure GenerateNewSeriesCodeValue(var NoSeriesCodes: List of [Text]; var NoSeriesCode: Text): Text var NewNoSeriesCode: Text; diff --git a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesGenerationDetail.Table.al b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesGenerationDetail.Table.al index 7f59e7b6da..529d0eafa8 100644 --- a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesGenerationDetail.Table.al +++ b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesGenerationDetail.Table.al @@ -84,6 +84,21 @@ table 392 "No. Series Generation Detail" { Caption = 'Message'; } + + field(20; "Setup Table Name"; Text[80]) + { + Caption = 'Setup Table'; + FieldClass = FlowField; + CalcFormula = lookup("Table Metadata".Caption where(ID = field("Setup Table No."))); + Editable = false; + } + field(21; "Setup Field Name"; Text[250]) + { + Caption = 'Setup Field'; + FieldClass = FlowField; + CalcFormula = lookup(Field."Field Caption" where(TableNo = field("Setup Table No."), "No." = field("Setup Field No."))); + Editable = false; + } } keys diff --git a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesGenerationSub.Page.al b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesGenerationSub.Page.al index 30c7272c50..e3280509ff 100644 --- a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesGenerationSub.Page.al +++ b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesGenerationSub.Page.al @@ -73,6 +73,19 @@ page 333 "No. Series Generation Sub" Style = Attention; Editable = false; } + field("Setup Table Name"; Rec."Setup Table Name") + { + ApplicationArea = All; + ToolTip = 'Specifies the value of the Setup Table Name field.'; + Enabled = IsEnabled; + } + field("Setup Field Name"; Rec."Setup Field Name") + { + ApplicationArea = All; + ToolTip = 'Specifies the value of the Setup Field Name field.'; + Enabled = IsEnabled; + } + } } } diff --git a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/Tools/NoSeriesCopToolsImpl.Codeunit.al b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/Tools/NoSeriesCopToolsImpl.Codeunit.al index 4b97e95cef..74abcc71dc 100644 --- a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/Tools/NoSeriesCopToolsImpl.Codeunit.al +++ b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/Tools/NoSeriesCopToolsImpl.Codeunit.al @@ -234,13 +234,18 @@ codeunit 336 "No. Series Cop. Tools Impl." foreach Entity in Entities do begin String1 := RecordMatchMgtCopy.RemoveShortWords(RemoveTextPart(TableMetadata.Caption, ' Setup') + ' ' + RemoveTextParts(Field.FieldName, GetNoSeriesAbbreviations())); String2 := RecordMatchMgtCopy.RemoveShortWords(Entity); - Score := RecordMatchMgtCopy.CalculateStringNearness(String1, String2, 1, 100) / 100; + Score := RecordMatchMgtCopy.CalculateStringNearness(String1, String2, GetMatchLengthTreshold(), 100) / 100; if Score >= RequiredNearness() then exit(true); end; exit(false); end; + local procedure GetMatchLengthTreshold(): Decimal + begin + exit(4); + end; + local procedure RequiredNearness(): Decimal begin exit(0.9) From 7c98b5dbfae8c4e2feb2e45eb2d82b3d52d956f2 Mon Sep 17 00:00:00 2001 From: Dmitry Katson Date: Tue, 17 Sep 2024 16:32:06 +0700 Subject: [PATCH 3/7] Refactor series code generation logic for improved efficiency. Simplify series code handling by removing redundant functions and streamlining the removal process, enhancing code readability and maintenance. --- .../Copilot/NoSeriesCopilotImpl.Codeunit.al | 27 ++----------------- .../Tools/NoSeriesCopToolsImpl.Codeunit.al | 2 +- 2 files changed, 3 insertions(+), 26 deletions(-) diff --git a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesCopilotImpl.Codeunit.al b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesCopilotImpl.Codeunit.al index f52fb31bb5..531af19613 100644 --- a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesCopilotImpl.Codeunit.al +++ b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesCopilotImpl.Codeunit.al @@ -454,35 +454,12 @@ codeunit 324 "No. Series Copilot Impl." Json.GetStringPropertyValueByName('seriesCode', NoSeriesCode); if NoSeriesCodes.Contains(NoSeriesCode) and (not IsExists) then begin - Json.ReplaceOrAddJPropertyInJObject('seriesCode', GenerateNewSeriesCodeValue(NoSeriesCodes, NoSeriesCode)); - NoSeriesObj := Json.GetObjectAsText(); - Json.ReplaceJObjectInCollection(i, NoSeriesObj); + Json.RemoveJObjectFromCollection(i); + exit; end; NoSeriesCodes.Add(NoSeriesCode); end; - local procedure GenerateNewSeriesCodeValue(var NoSeriesCodes: List of [Text]; var NoSeriesCode: Text): Text - var - NewNoSeriesCode: Text; - begin - repeat - NewNoSeriesCode := CopyStr(NoSeriesCode, 1, 18) + '-' + RandomCharacter(); - until not NoSeriesCodes.Contains(NewNoSeriesCode); - - NoSeriesCode := NewNoSeriesCode; - exit(NewNoSeriesCode); - end; - - local procedure RandomCharacter(): Char - begin - exit(RandIntInRange(33, 126)); // ASCII: ! (33) to ~ (126) - end; - - local procedure RandIntInRange(MinInt: Integer; MaxInt: Integer): Integer - begin - exit(MinInt - 1 + Random(MaxInt - MinInt + 1)); - end; - local procedure InsertGeneratedNoSeries(var GeneratedNoSeries: Record "No. Series Generation Detail"; NoSeriesObj: Text; GenerationNo: Integer) var Json: Codeunit Json; diff --git a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/Tools/NoSeriesCopToolsImpl.Codeunit.al b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/Tools/NoSeriesCopToolsImpl.Codeunit.al index 74abcc71dc..13787c2dc1 100644 --- a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/Tools/NoSeriesCopToolsImpl.Codeunit.al +++ b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/Tools/NoSeriesCopToolsImpl.Codeunit.al @@ -243,7 +243,7 @@ codeunit 336 "No. Series Cop. Tools Impl." local procedure GetMatchLengthTreshold(): Decimal begin - exit(4); + exit(2); end; local procedure RequiredNearness(): Decimal From 4a8516365854255da3c38797dc75d0e20a277d14 Mon Sep 17 00:00:00 2001 From: Dmitry Katson Date: Tue, 17 Sep 2024 21:15:52 +0700 Subject: [PATCH 4/7] Refactor code to conditionally insert record Instead of unconditionally inserting a record, the change introduces a conditional check before insertion to improve control flow. This alteration enhances the validation process during record creation. --- .../NoSeriesCopilot/src/Copilot/NoSeriesCopilotImpl.Codeunit.al | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesCopilotImpl.Codeunit.al b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesCopilotImpl.Codeunit.al index 531af19613..f92cb15889 100644 --- a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesCopilotImpl.Codeunit.al +++ b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesCopilotImpl.Codeunit.al @@ -481,7 +481,7 @@ codeunit 324 "No. Series Copilot Impl." Json.GetValueAndSetToRecFieldNo(RecRef, 'nextYear', GeneratedNoSeries.FieldNo("Is Next Year")); Json.GetValueAndSetToRecFieldNo(RecRef, 'exists', GeneratedNoSeries.FieldNo(Exists)); Json.GetValueAndSetToRecFieldNo(RecRef, 'message', GeneratedNoSeries.FieldNo(Message)); - RecRef.Insert(true); + if RecRef.Insert(true) then; ValidateGeneratedNoSeries(RecRef); end; From 68d8a2e98015de7d589b7c3d8503c47d3534961f Mon Sep 17 00:00:00 2001 From: Jesper Schulz-Wedde Date: Wed, 18 Sep 2024 08:12:38 +0200 Subject: [PATCH 5/7] Apply suggestions from code review --- .../src/Copilot/NoSeriesCopilotImpl.Codeunit.al | 2 +- .../src/Copilot/NoSeriesGenerationDetail.Table.al | 1 - .../src/Copilot/Tools/NoSeriesCopAddIntent.Codeunit.al | 2 +- .../src/Copilot/Tools/NoSeriesCopToolsImpl.Codeunit.al | 4 ++-- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesCopilotImpl.Codeunit.al b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesCopilotImpl.Codeunit.al index f92cb15889..fb4fcdeb2a 100644 --- a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesCopilotImpl.Codeunit.al +++ b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesCopilotImpl.Codeunit.al @@ -19,7 +19,7 @@ codeunit 324 "No. Series Copilot Impl." var IncorrectCompletionErr: Label 'Incorrect completion. The property %1 is empty', Comment = '%1 = property name'; - EmptyCompletionErr: Label 'Incorrect completion. The completion is empty'; + EmptyCompletionErr: Label 'Incorrect completion. The completion is empty.'; IncorrectCompletionNumberOfGeneratedNoSeriesErr: Label 'Incorrect completion. The number of generated number series is incorrect. Expected %1, but got %2', Comment = '%1 = Expected Number, %2 = Actual Number'; TextLengthIsOverMaxLimitErr: Label 'The property %1 exceeds the maximum length of %2', Comment = '%1 = property name, %2 = maximum length'; DateSpecificPlaceholderLbl: Label '{current_date}', Locked = true; diff --git a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesGenerationDetail.Table.al b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesGenerationDetail.Table.al index 529d0eafa8..9aff263436 100644 --- a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesGenerationDetail.Table.al +++ b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesGenerationDetail.Table.al @@ -84,7 +84,6 @@ table 392 "No. Series Generation Detail" { Caption = 'Message'; } - field(20; "Setup Table Name"; Text[80]) { Caption = 'Setup Table'; diff --git a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/Tools/NoSeriesCopAddIntent.Codeunit.al b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/Tools/NoSeriesCopAddIntent.Codeunit.al index d3d82e58f1..b2377be60d 100644 --- a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/Tools/NoSeriesCopAddIntent.Codeunit.al +++ b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/Tools/NoSeriesCopAddIntent.Codeunit.al @@ -164,10 +164,10 @@ codeunit 331 "No. Series Cop. Add Intent" implements "AOAI Function" local procedure SaveExistingNoSeries(TempTableMetadata: Record "Table Metadata" temporary; FieldRef: FieldRef) var - ExistingNoSeriesJObj: JsonObject; NoSeries: Record "No. Series"; NoSeriesLine: Record "No. Series Line"; NoSeriesManagement: Codeunit "No. Series"; + ExistingNoSeriesJObj: JsonObject; begin if not NoSeries.Get(Format(FieldRef.Value)) then exit; diff --git a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/Tools/NoSeriesCopToolsImpl.Codeunit.al b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/Tools/NoSeriesCopToolsImpl.Codeunit.al index 13787c2dc1..7fc97a5beb 100644 --- a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/Tools/NoSeriesCopToolsImpl.Codeunit.al +++ b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/Tools/NoSeriesCopToolsImpl.Codeunit.al @@ -234,14 +234,14 @@ codeunit 336 "No. Series Cop. Tools Impl." foreach Entity in Entities do begin String1 := RecordMatchMgtCopy.RemoveShortWords(RemoveTextPart(TableMetadata.Caption, ' Setup') + ' ' + RemoveTextParts(Field.FieldName, GetNoSeriesAbbreviations())); String2 := RecordMatchMgtCopy.RemoveShortWords(Entity); - Score := RecordMatchMgtCopy.CalculateStringNearness(String1, String2, GetMatchLengthTreshold(), 100) / 100; + Score := RecordMatchMgtCopy.CalculateStringNearness(String1, String2, GetMatchLengthThreshold(), 100) / 100; if Score >= RequiredNearness() then exit(true); end; exit(false); end; - local procedure GetMatchLengthTreshold(): Decimal + local procedure GetMatchLengthThreshold(): Decimal begin exit(2); end; From a1ee36cb546445ec4593b602e3340f478c358ac5 Mon Sep 17 00:00:00 2001 From: Jesper Schulz-Wedde Date: Wed, 18 Sep 2024 09:44:06 +0200 Subject: [PATCH 6/7] Add missing namespace --- .../src/Copilot/NoSeriesGenerationDetail.Table.al | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesGenerationDetail.Table.al b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesGenerationDetail.Table.al index 9aff263436..a6c0f25a09 100644 --- a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesGenerationDetail.Table.al +++ b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesGenerationDetail.Table.al @@ -5,6 +5,8 @@ namespace Microsoft.Foundation.NoSeries; +using System.Reflection; + table 392 "No. Series Generation Detail" { TableType = Temporary; @@ -151,4 +153,4 @@ table 392 "No. Series Generation Detail" Rec."Starting Date" := CalcDate('<-CY+1Y>', Today); end; -} \ No newline at end of file +} From 97835af3bd1b7a444b3ea33f4f8809c4282aaf48 Mon Sep 17 00:00:00 2001 From: Jesper Schulz-Wedde Date: Wed, 18 Sep 2024 10:08:25 +0200 Subject: [PATCH 7/7] Remove do..begin --- .../src/Copilot/NoSeriesCopilotImpl.Codeunit.al | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesCopilotImpl.Codeunit.al b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesCopilotImpl.Codeunit.al index fb4fcdeb2a..22c284f72e 100644 --- a/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesCopilotImpl.Codeunit.al +++ b/src/Business Foundation/App/NoSeriesCopilot/src/Copilot/NoSeriesCopilotImpl.Codeunit.al @@ -435,9 +435,8 @@ codeunit 324 "No. Series Copilot Impl." begin Json.InitializeCollection(NoSeriesArrText); - for i := 0 to Json.GetCollectionCount() - 1 do begin + for i := 0 to Json.GetCollectionCount() - 1 do ProcessNoSeries(i, NoSeriesCodes, Json); - end; NoSeriesArrText := Json.GetCollectionAsText() end;