You’ve just finished implementing a new feature: a codeunit that processes sales orders and applies volume-based discounts. Before submitting for peer review, you want to use AI to catch potential issues.
Use AI to identify:
Here’s the codeunit we’ll review:
codeunit 50100 "Sales Order Discount Processor"
{
procedure ApplyVolumeDiscounts(var SalesHeader: Record "Sales Header")
var
SalesLine: Record "Sales Line";
TotalQuantity: Decimal;
DiscountPct: Decimal;
begin
TotalQuantity := 0;
SalesLine.SetRange("Document Type", SalesHeader."Document Type");
SalesLine.SetRange("Document No.", SalesHeader."No.");
if SalesLine.FindSet() then
repeat
TotalQuantity := TotalQuantity + SalesLine.Quantity;
until SalesLine.Next() = 0;
if TotalQuantity > 100 then
DiscountPct := 15
else if TotalQuantity > 50 then
DiscountPct := 10
else if TotalQuantity > 10 then
DiscountPct := 5;
SalesLine.Reset();
if SalesLine.FindSet() then
repeat
SalesLine."Line Discount %" := DiscountPct;
SalesLine.Modify();
until SalesLine.Next() = 0;
end;
}
Prompt:
Review this AL codeunit for potential bugs, code quality issues, and best practice violations.
[Paste the code above]
Specifically check for:
- Logical errors
- Missing error handling
- Variable declarations
- Commit/transaction issues
- Performance concerns
Expected AI Findings: The AI should identify issues like:
FindSet(true, false)
parameters for modificationPrompt:
Analyze the performance of this code, especially database operations.
What are potential performance issues? How can it be optimized?
[Include the code or reference it if in context]
Expected AI Suggestions:
Prompt:
Check this code against AL coding best practices and Business Central development standards.
What improvements would you recommend?
Expected AI Recommendations:
Prompt:
Rewrite this codeunit implementing all the improvements you suggested.
Include:
- XML documentation
- Error handling
- Performance optimizations
- Best practice compliance
- Telemetry/logging
- Discount tiers from setup table instead of hard-coded values
Review the Generated Code: The AI should generate something like:
/// <summary>
/// Processes sales orders and applies volume-based discounts
/// </summary>
codeunit 50100 "Sales Order Discount Processor"
{
/// <summary>
/// Applies volume-based discounts to a sales order
/// </summary>
/// <param name="SalesHeader">The sales header to process</param>
procedure ApplyVolumeDiscounts(var SalesHeader: Record "Sales Header")
var
SalesLine: Record "Sales Line";
TotalQuantity: Decimal;
DiscountPct: Decimal;
begin
if SalesHeader."No." = '' then
Error('Sales order number cannot be empty.');
TotalQuantity := CalculateTotalQuantity(SalesHeader);
DiscountPct := GetDiscountPercentage(TotalQuantity);
if DiscountPct > 0 then
ApplyDiscountToLines(SalesHeader, DiscountPct);
LogTelemetry(SalesHeader."No.", TotalQuantity, DiscountPct);
end;
local procedure CalculateTotalQuantity(SalesHeader: Record "Sales Header"): Decimal
var
SalesLine: Record "Sales Line";
TotalQty: Decimal;
begin
SalesLine.SetRange("Document Type", SalesHeader."Document Type");
SalesLine.SetRange("Document No.", SalesHeader."No.");
SalesLine.SetLoadFields(Quantity);
if SalesLine.FindSet() then
repeat
TotalQty += SalesLine.Quantity;
until SalesLine.Next() = 0;
exit(TotalQty);
end;
local procedure GetDiscountPercentage(TotalQuantity: Decimal): Decimal
var
VolumeDiscountSetup: Record "Volume Discount Setup"; // Assuming this table exists
begin
VolumeDiscountSetup.SetFilter("Minimum Quantity", '<=%1', TotalQuantity);
VolumeDiscountSetup.SetCurrentKey("Minimum Quantity");
VolumeDiscountSetup.Ascending(false);
if VolumeDiscountSetup.FindFirst() then
exit(VolumeDiscountSetup."Discount Percentage");
exit(0);
end;
local procedure ApplyDiscountToLines(SalesHeader: Record "Sales Header"; DiscountPct: Decimal)
var
SalesLine: Record "Sales Line";
begin
SalesLine.SetRange("Document Type", SalesHeader."Document Type");
SalesLine.SetRange("Document No.", SalesHeader."No.");
SalesLine.ModifyAll("Line Discount %", DiscountPct, true);
end;
local procedure LogTelemetry(DocumentNo: Code[20]; TotalQty: Decimal; DiscountPct: Decimal)
var
Telemetry: Codeunit Telemetry;
CustomDimensions: Dictionary of [Text, Text];
begin
CustomDimensions.Add('DocumentNo', DocumentNo);
CustomDimensions.Add('TotalQuantity', Format(TotalQty));
CustomDimensions.Add('DiscountPercentage', Format(DiscountPct));
Telemetry.LogMessage('0001', 'Volume discount applied', Verbosity::Normal,
DataClassification::SystemMetadata, TelemetryScope::All, CustomDimensions);
end;
}
After AI generates the improved code, verify:
Review this code for potential security issues:
- Input validation
- Authorization checks
- Data access controls
- Potential injection vulnerabilities
Analyze this code for testability.
What makes it easy or hard to test?
How can it be restructured to be more testable?
Review the XML documentation for this code.
Is it complete? Clear? Helpful?
What additional documentation would be valuable?
Be aware AI might not catch:
Business Logic Errors
Integration Issues
BC Version Compatibility
Organization Standards
Instead of “review this code”, specify what to look for:
Review for: performance, error handling, AL best practices, testability
Don’t try to review everything at once:
Use AI review alongside:
Review, improve, review again:
Review the updated code. Are there any remaining issues?
Keep track of:
Try reviewing this code with AI:
procedure CalculateShippingCost(SalesHeader: Record "Sales Header"): Decimal
var
SalesLine: Record "Sales Line";
Weight: Decimal;
begin
Weight := 0;
SalesLine.SetRange("Document No.", SalesHeader."No.");
if SalesLine.Find('-') then
repeat
Weight := Weight + SalesLine.Quantity;
until SalesLine.Next() = 0;
if Weight < 10 then
exit(5.00)
else
exit(10.00);
end;
Your Tasks:
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.