Page 7004 Sales Line Discounts, source in 29

Source29

src/Layers/W1/BaseApp/Sales/Pricing/SalesLineDiscounts.Page.al668 lines, Copyright (c) Microsoft Corporation. MIT

// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------
namespace Microsoft.Sales.Pricing;

using Microsoft.CRM.Campaign;
using Microsoft.Finance.Currency;
using Microsoft.Inventory.Item;
using Microsoft.Pricing.Calculation;
using Microsoft.Sales.Customer;
using System.Environment;
using System.Globalization;
using System.Text;

/// <summary>
/// Displays and manages sales line discounts with filtering by sales type, item type, and date range.
/// </summary>
page 7004 "Sales Line Discounts"
{
    Caption = 'Sales Line Discounts';
    DataCaptionExpression = PageCaptionText;
    DelayedInsert = true;
    PageType = List;
    SaveValues = true;
    ShowFilter = false;
    SourceTable = "Sales Line Discount";

    layout
    {
        area(content)
        {
            group(General)
            {
                Caption = 'General';
                Visible = not IsOnMobile;
                field(SalesTypeFilter; SalesTypeFilter)
                {
                    ApplicationArea = Basic, Suite;
                    Caption = 'Sales Type Filter';
                    OptionCaption = 'Customer,Customer Discount Group,All Customers,Campaign,None';
                    ToolTip = 'Specifies a filter for which sales line discounts to display.';

                    trigger OnValidate()
                    begin
                        SalesTypeFilterOnAfterValidate();
                    end;
                }
                field(SalesCodeFilterCtrl; SalesCodeFilter)
                {
                    ApplicationArea = Basic, Suite;
                    Caption = 'Sales Code Filter';
                    Enabled = SalesCodeFilterCtrlEnable;
                    ToolTip = 'Specifies a filter for which sales line discounts to display.';

                    trigger OnLookup(var Text: Text): Boolean
                    var
                        CustList: Page "Customer List";
                        CustDiscGrList: Page "Customer Disc. Groups";
                        CampaignList: Page "Campaign List";
                    begin
                        if SalesTypeFilter = SalesTypeFilter::"All Customers" then
                            exit;

                        case SalesTypeFilter of
                            SalesTypeFilter::Customer:
                                begin
                                    CustList.LookupMode := true;
                                    if CustList.RunModal() = ACTION::LookupOK then
                                        Text := CustList.GetSelectionFilter()
                                    else
                                        exit(false);
                                end;
                            SalesTypeFilter::"Customer Discount Group":
                                begin
                                    CustDiscGrList.LookupMode := true;
                                    if CustDiscGrList.RunModal() = ACTION::LookupOK then
                                        Text := CustDiscGrList.GetSelectionFilter()
                                    else
                                        exit(false);
                                end;
                            SalesTypeFilter::Campaign:
                                begin
                                    CampaignList.LookupMode := true;
                                    if CampaignList.RunModal() = ACTION::LookupOK then
                                        Text := CampaignList.GetSelectionFilter()
                                    else
                                        exit(false);
                                end;
                        end;

                        exit(true);
                    end;

                    trigger OnValidate()
                    begin
                        SalesCodeFilterOnAfterValidate();
                    end;
                }
                field(StartingDateFilter; StartingDateFilter)
                {
                    ApplicationArea = Basic, Suite;
                    Caption = 'Starting Date Filter';
                    ToolTip = 'Specifies a filter for which sales line discounts to display.';

                    trigger OnValidate()
                    var
                        FilterTokens: Codeunit "Filter Tokens";
                    begin
                        FilterTokens.MakeDateFilter(StartingDateFilter);
                        StartingDateFilterOnAfterValid();
                    end;
                }
                field(ItemTypeFilter; ItemTypeFilter)
                {
                    ApplicationArea = Basic, Suite;
                    Caption = 'Type Filter';
                    OptionCaption = 'Item,Item Discount Group,None';
                    ToolTip = 'Specifies a filter for which sales line discounts to display.';

                    trigger OnValidate()
                    begin
                        ItemTypeFilterOnAfterValidate();
                    end;
                }
                field(CodeFilterCtrl; CodeFilter)
                {
                    ApplicationArea = Basic, Suite;
                    Caption = 'Code Filter';
                    Enabled = CodeFilterCtrlEnable;
                    ToolTip = 'Specifies a filter for which sales line discounts to display.';

                    trigger OnLookup(var Text: Text) Result: Boolean
                    var
                        ItemList: Page "Item List";
                        ItemDiscGrList: Page "Item Disc. Groups";
                    begin
                        Result := true;
                        case Rec.Type of
                            Rec.Type::Item:
                                begin
                                    ItemList.LookupMode := true;
                                    if ItemList.RunModal() = ACTION::LookupOK then
                                        Text := ItemList.GetSelectionFilter()
                                    else
                                        Result := false;
                                end;
                            Rec.Type::"Item Disc. Group":
                                begin
                                    ItemDiscGrList.LookupMode := true;
                                    if ItemDiscGrList.RunModal() = ACTION::LookupOK then
                                        Text := ItemDiscGrList.GetSelectionFilter()
                                    else
                                        Result := false;
                                end;
                            else
                                OnLookupCodeFilterCaseElse(Rec, Text, Result);
                        end;

                        exit(Result);
                    end;

                    trigger OnValidate()
                    begin
                        CodeFilterOnAfterValidate();
                    end;
                }
                field(SalesCodeFilterCtrl2; CurrencyCodeFilter)
                {
                    ApplicationArea = Suite;
                    Caption = 'Currency Code Filter';
                    ToolTip = 'Specifies a filter for which sales line discounts to display.';

                    trigger OnLookup(var Text: Text): Boolean
                    var
                        CurrencyList: Page Currencies;
                    begin
                        CurrencyList.LookupMode := true;
                        if CurrencyList.RunModal() = ACTION::LookupOK then
                            Text := CurrencyList.GetSelectionFilter()
                        else
                            exit(false);

                        exit(true);
                    end;

                    trigger OnValidate()
                    begin
                        CurrencyCodeFilterOnAfterValid();
                    end;
                }
            }
            group(Filters)
            {
                Caption = 'Filters';
                Visible = IsOnMobile;
                field(FilterDescription; GetFilterDescription())
                {
                    ApplicationArea = Basic, Suite;
                    Editable = false;
                    ShowCaption = false;
                    ToolTip = 'Specifies a filter for which sales line discounts to display.';

                    trigger OnAssistEdit()
                    begin
                        FilterLines();
                        CurrPage.Update(false);
                    end;
                }
            }
            repeater(Control1)
            {
                ShowCaption = false;
                field("Sales Type"; Rec."Sales Type")
                {
                    ApplicationArea = Basic, Suite;

                    trigger OnValidate()
                    begin
                        SetEditableFields();
                    end;
                }
                field("Sales Code"; Rec."Sales Code")
                {
                    ApplicationArea = Basic, Suite;
                    Editable = SalesCodeEditable;
                }
                field(Type; Rec.Type)
                {
                    ApplicationArea = Basic, Suite;
                }
                field("Code"; Rec.Code)
                {
                    ApplicationArea = Basic, Suite;
                }
                field("Variant Code"; Rec."Variant Code")
                {
                    ApplicationArea = Planning;
                    Visible = false;
                }
                field("Currency Code"; Rec."Currency Code")
                {
                    ApplicationArea = Suite;
                    Visible = false;
                }
                field("Unit of Measure Code"; Rec."Unit of Measure Code")
                {
                    ApplicationArea = Basic, Suite;
                }
                field("Minimum Quantity"; Rec."Minimum Quantity")
                {
                    ApplicationArea = Basic, Suite;
                }
                field("Line Discount %"; Rec."Line Discount %")
                {
                    ApplicationArea = Basic, Suite;
                    ToolTip = 'Specifies the discount percentage that is granted for the item on the line.';
                }
                field("Starting Date"; Rec."Starting Date")
                {
                    ApplicationArea = Basic, Suite;
                }
                field("Ending Date"; Rec."Ending Date")
                {
                    ApplicationArea = Basic, Suite;
                }
            }
        }
        area(factboxes)
        {
            systempart(Control1900383207; Links)
            {
                ApplicationArea = RecordLinks;
                Visible = false;
            }
            systempart(Control1905767507; Notes)
            {
                ApplicationArea = Notes;
                Visible = false;
            }
        }
    }

    actions
    {
        area(processing)
        {
            action(SalesLineDiscountsFilter)
            {
                ApplicationArea = Basic, Suite;
                Caption = 'Filter';
                Image = "Filter";
                ToolTip = 'Apply the filter.';
                Visible = IsOnMobile;

                trigger OnAction()
                begin
                    FilterLines();
                end;
            }
            action(ClearFilter)
            {
                ApplicationArea = Basic, Suite;
                Caption = 'Clear Filter';
                Image = ClearFilter;
                ToolTip = 'Clear filter.';
                Visible = IsOnMobile;

                trigger OnAction()
                begin
                    Rec.Reset();
                    UpdateBasicRecFilters();
                    SetEditableFields();
                end;
            }
        }
        area(Promoted)
        {
            group(Category_Process)
            {
                Caption = 'Process';

                actionref(SalesLineDiscountsFilter_Promoted; SalesLineDiscountsFilter)
                {
                }
                actionref(ClearFilter_Promoted; ClearFilter)
                {
                }
            }
        }
    }

    trigger OnAfterGetCurrRecord()
    begin
        SetEditableFields();
    end;

    trigger OnInit()
    var
        FeaturePriceCalculation: Codeunit "Feature - Price Calculation";
    begin
        FeaturePriceCalculation.FailIfFeatureEnabled();
        CodeFilterCtrlEnable := true;
        SalesCodeFilterCtrlEnable := true;
        SalesCodeEditable := true;
    end;

    trigger OnOpenPage()
    begin
        IsOnMobile := ClientTypeManagement.GetCurrentClientType() = CLIENTTYPE::Phone;
        GetRecFilters();
        SetRecFilters();
        SetCaption();
    end;

    var
        Cust: Record Customer;
        CustDiscGr: Record "Customer Discount Group";
        Campaign: Record Campaign;
        Item: Record Item;
        ItemDiscGr: Record "Item Discount Group";
        ClientTypeManagement: Codeunit "Client Type Management";
#pragma warning disable AA0074
        Text000: Label 'All Customers';
#pragma warning restore AA0074
        PageCaptionText: Text;
        SalesCodeEditable: Boolean;
        SalesCodeFilterCtrlEnable: Boolean;
        CodeFilterCtrlEnable: Boolean;
        IsOnMobile: Boolean;

    protected var
        CodeFilter: Text;
        CurrencyCodeFilter: Text;
        SalesCodeFilter: Text;
        SalesTypeFilter: Option Customer,"Customer Discount Group","All Customers",Campaign,"None";
        ItemTypeFilter: Option Item,"Item Discount Group","None";
        StartingDateFilter: Text[30];

    local procedure GetRecFilters()
    begin
        if Rec.GetFilters() <> '' then
            UpdateBasicRecFilters();
    end;

    /// <summary>
    /// Applies filter settings to the sales line discount records based on current filter values.
    /// </summary>
    procedure SetRecFilters()
    begin
        SalesCodeFilterCtrlEnable := true;
        CodeFilterCtrlEnable := true;

        if SalesTypeFilter <> SalesTypeFilter::None then
            Rec.SetRange("Sales Type", SalesTypeFilter)
        else
            Rec.SetRange("Sales Type");

        if SalesTypeFilter in [SalesTypeFilter::"All Customers", SalesTypeFilter::None] then begin
            SalesCodeFilterCtrlEnable := false;
            SalesCodeFilter := '';
        end;

        if SalesCodeFilter <> '' then
            Rec.SetFilter("Sales Code", SalesCodeFilter)
        else
            Rec.SetRange("Sales Code");

        if ItemTypeFilter <> ItemTypeFilter::None then
            Rec.SetRange(Type, ItemTypeFilter)
        else
            Rec.SetRange(Type);

        if ItemTypeFilter = ItemTypeFilter::None then begin
            CodeFilterCtrlEnable := false;
            CodeFilter := '';
        end;

        if CodeFilter <> '' then
            Rec.SetFilter(Code, CodeFilter)
        else
            Rec.SetRange(Code);

        if CurrencyCodeFilter <> '' then
            Rec.SetFilter("Currency Code", CurrencyCodeFilter)
        else
            Rec.SetRange("Currency Code");

        if StartingDateFilter <> '' then
            Rec.SetFilter("Starting Date", StartingDateFilter)
        else
            Rec.SetRange("Starting Date");

        OnSetRecFiltersOnBeforeCurrPageUpdate(Rec, ItemTypeFilter);
        CurrPage.Update(false);
    end;

    local procedure SetCaption()
    begin
        if IsOnMobile then
            PageCaptionText := ''
        else
            PageCaptionText := GetFilterDescription();
    end;

    local procedure GetFilterDescription(): Text
    var
        ObjTranslation: Record "Object Translation";
        SourceTableName: Text;
        SalesSrcTableName: Text;
        Description: Text;
    begin
        GetRecFilters();

        SourceTableName := '';
        case ItemTypeFilter of
            ItemTypeFilter::Item:
                begin
                    SourceTableName := ObjTranslation.TranslateObject(ObjTranslation."Object Type"::Table, 27);
                    Item.SetFilter("No.", CodeFilter);
                    if not Item.FindFirst() then
                        Clear(Item);
                end;
            ItemTypeFilter::"Item Discount Group":
                begin
                    SourceTableName := ObjTranslation.TranslateObject(ObjTranslation."Object Type"::Table, 341);
                    ItemDiscGr.SetFilter(Code, CodeFilter);
                    if not ItemDiscGr.FindFirst() then
                        Clear(ItemDiscGr);
                end;
            else
                OnGetFilterDescriptionCaseElse(Rec, ItemTypeFilter, SourceTableName, Item);
        end;

        SalesSrcTableName := '';
        Description := '';
        case SalesTypeFilter of
            SalesTypeFilter::Customer:
                begin
                    SalesSrcTableName := ObjTranslation.TranslateObject(ObjTranslation."Object Type"::Table, 18);
                    Cust.SetFilter("No.", SalesCodeFilter);
                    if Cust.FindFirst() then
                        Description := Cust.Name;
                end;
            SalesTypeFilter::"Customer Discount Group":
                begin
                    SalesSrcTableName := ObjTranslation.TranslateObject(ObjTranslation."Object Type"::Table, 340);
                    CustDiscGr.SetFilter(Code, SalesCodeFilter);
                    if CustDiscGr.FindFirst() then
                        Description := CustDiscGr.Description;
                end;
            SalesTypeFilter::Campaign:
                begin
                    SalesSrcTableName := ObjTranslation.TranslateObject(ObjTranslation."Object Type"::Table, 5071);
                    Campaign.SetFilter("No.", SalesCodeFilter);
                    if Campaign.FindFirst() then
                        Description := Campaign.Description;
                end;
            SalesTypeFilter::"All Customers":
                SalesSrcTableName := Text000;
        end;

        if SalesSrcTableName = Text000 then
            exit(StrSubstNo('%1 %2 %3 %4 %5', SalesSrcTableName, SalesCodeFilter, Description, SourceTableName, CodeFilter));
        exit(StrSubstNo('%1 %2 %3 %4 %5', SalesSrcTableName, SalesCodeFilter, Description, SourceTableName, CodeFilter));
    end;

    local procedure SalesCodeFilterOnAfterValidate()
    begin
        CurrPage.SaveRecord();
        SetRecFilters();
        SetCaption();
    end;

    local procedure SalesTypeFilterOnAfterValidate()
    begin
        CurrPage.SaveRecord();
        SalesCodeFilter := '';
        SetRecFilters();
        SetCaption();
    end;

    local procedure StartingDateFilterOnAfterValid()
    begin
        CurrPage.SaveRecord();
        SetRecFilters();
    end;

    local procedure ItemTypeFilterOnAfterValidate()
    begin
        CurrPage.SaveRecord();
        CodeFilter := '';
        SetRecFilters();
    end;

    local procedure CodeFilterOnAfterValidate()
    begin
        CurrPage.SaveRecord();
        SetRecFilters();
        SetCaption();
    end;

    local procedure CurrencyCodeFilterOnAfterValid()
    begin
        CurrPage.SaveRecord();
        SetRecFilters();
    end;

    local procedure GetSalesTypeFilter(): Integer
    begin
        case Rec.GetFilter("Sales Type") of
            Format(Rec."Sales Type"::Customer):
                exit(0);
            Format(Rec."Sales Type"::"Customer Disc. Group"):
                exit(1);
            Format(Rec."Sales Type"::"All Customers"):
                exit(2);
            Format(Rec."Sales Type"::Campaign):
                exit(3);
        end;
    end;

    local procedure GetTypeFilter() TypeFilter: Integer
    begin
        case Rec.GetFilter(Type) of
            Format(Rec.Type::Item):
                exit(0);
            Format(Rec.Type::"Item Disc. Group"):
                exit(1);
            else
                OnGetTypeFilterCaseElse(Rec, TypeFilter);
        end;
    end;

    local procedure FilterLines()
    var
        FilterPageBuilder: FilterPageBuilder;
    begin
        FilterPageBuilder.AddTable(Rec.TableCaption, DATABASE::"Sales Line Discount");
        FilterPageBuilder.SetView(Rec.TableCaption, Rec.GetView());

        if Rec.GetFilter("Sales Type") = '' then
            FilterPageBuilder.AddFieldNo(Rec.TableCaption, Rec.FieldNo("Sales Type"));
        if Rec.GetFilter("Sales Code") = '' then
            FilterPageBuilder.AddFieldNo(Rec.TableCaption, Rec.FieldNo("Sales Code"));
        if Rec.GetFilter(Type) = '' then
            FilterPageBuilder.AddFieldNo(Rec.TableCaption, Rec.FieldNo(Type));
        if Rec.GetFilter(Code) = '' then
            FilterPageBuilder.AddFieldNo(Rec.TableCaption, Rec.FieldNo(Code));
        if Rec.GetFilter("Starting Date") = '' then
            FilterPageBuilder.AddFieldNo(Rec.TableCaption, Rec.FieldNo("Starting Date"));
        if Rec.GetFilter("Currency Code") = '' then
            FilterPageBuilder.AddFieldNo(Rec.TableCaption, Rec.FieldNo("Currency Code"));

        if FilterPageBuilder.RunModal() then
            Rec.SetView(FilterPageBuilder.GetView(Rec.TableCaption));

        UpdateBasicRecFilters();
        SetEditableFields();
    end;

    local procedure UpdateBasicRecFilters()
    begin
        if Rec.GetFilter("Sales Type") <> '' then
            SalesTypeFilter := GetSalesTypeFilter()
        else
            SalesTypeFilter := SalesTypeFilter::None;

        if Rec.GetFilter(Type) <> '' then
            ItemTypeFilter := GetTypeFilter()
        else
            ItemTypeFilter := ItemTypeFilter::None;

        SalesCodeFilter := Rec.GetFilter("Sales Code");
        CodeFilter := Rec.GetFilter(Code);
        CurrencyCodeFilter := Rec.GetFilter("Currency Code");
        Evaluate(StartingDateFilter, Rec.GetFilter("Starting Date"));
    end;

    local procedure SetEditableFields()
    begin
        SalesCodeEditable := Rec."Sales Type" <> Rec."Sales Type"::"All Customers";
    end;

    /// <summary>
    /// Raises an event to handle custom lookup for code filter when the type is not Item or Item Disc. Group.
    /// </summary>
    /// <param name="SalesLineDiscount">The sales line discount record.</param>
    /// <param name="Text">The lookup text value.</param>
    /// <param name="Result">The result of the lookup operation.</param>
    [IntegrationEvent(true, false)]
    local procedure OnLookupCodeFilterCaseElse(SalesLineDiscount: Record "Sales Line Discount"; var Text: Text; var Result: Boolean)
    begin
    end;

    /// <summary>
    /// Raises an event to handle custom type filter conversion when the type is not Item or Item Disc. Group.
    /// </summary>
    /// <param name="SalesLineDiscount">The sales line discount record.</param>
    /// <param name="TypeFilter">The type filter integer value to set.</param>
    [IntegrationEvent(true, false)]
    local procedure OnGetTypeFilterCaseElse(var SalesLineDiscount: Record "Sales Line Discount"; var TypeFilter: Integer)
    begin
    end;

    /// <summary>
    /// Raises an event after the record filters have been applied and before the page is updated, allowing subscribers to apply additional filtering based on the current item type filter.
    /// </summary>
    /// <param name="SalesLineDiscount">The sales line discount record being filtered.</param>
    /// <param name="ItemTypeFilter">The current item type filter value.</param>
    [IntegrationEvent(true, false)]
    local procedure OnSetRecFiltersOnBeforeCurrPageUpdate(var SalesLineDiscount: Record "Sales Line Discount"; ItemTypeFilter: Option Item,"Item Discount Group","None")
    begin
    end;

    /// <summary>
    /// Raises an event to resolve the filter description when the item type filter is not Item or Item Discount Group, allowing subscribers to provide a custom source table name and item filtering.
    /// </summary>
    /// <param name="SalesLineDiscount">The sales line discount record being described.</param>
    /// <param name="ItemTypeFilter">The current item type filter value.</param>
    /// <param name="SourceTableName">The source table name to display in the filter description.</param>
    /// <param name="Item">The item record used to build the filter description.</param>
    [IntegrationEvent(true, false)]
    local procedure OnGetFilterDescriptionCaseElse(var SalesLineDiscount: Record "Sales Line Discount"; ItemTypeFilter: Option Item,"Item Discount Group","None"; var SourceTableName: Text; var Item: Record Item)
    begin
    end;
}