Table 13 Salesperson/Purchaser, source in 29

Source29

src/Layers/W1/BaseApp/CRM/Team/SalespersonPurchaser.Table.al589 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.CRM.Team;

using Microsoft.CRM.Campaign;
using Microsoft.CRM.Contact;
using Microsoft.CRM.Interaction;
using Microsoft.CRM.Opportunity;
using Microsoft.CRM.Segment;
using Microsoft.CRM.Task;
using Microsoft.Finance.Dimension;
using Microsoft.Integration.Dataverse;
using Microsoft.Purchases.Payables;
using Microsoft.Sales.Receivables;
using System.Email;

table 13 "Salesperson/Purchaser"
{
    Caption = 'Salesperson/Purchaser';
    DataCaptionFields = "Code", Name;
    DataClassification = CustomerContent;
    LookupPageID = "Salespersons/Purchasers";

    fields
    {
        field(1; "Code"; Code[20])
        {
            Caption = 'Code';
            ToolTip = 'Specifies a code for the salesperson or purchaser.';
            NotBlank = true;

            trigger OnValidate()
            begin
                TestField(Code);
            end;
        }
        field(2; Name; Text[50])
        {
            Caption = 'Name';
            ToolTip = 'Specifies the name of the salesperson or purchaser.';
        }
        field(3; "Commission %"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Commission %';
            ToolTip = 'Specifies the percentage to use to calculate the salesperson''s commission.';
            DecimalPlaces = 2 : 2;
            MaxValue = 100;
            MinValue = 0;
        }
        field(140; Image; Media)
        {
            Caption = 'Image';
            ToolTip = 'Specifies the picture that has been inserted for the salesperson or purchaser.';
            ExtendedDatatype = Person;
        }
        field(150; "Privacy Blocked"; Boolean)
        {
            Caption = 'Privacy Blocked';
            ToolTip = 'Specifies whether to limit access to data for the data subject during daily operations. This is useful, for example, when protecting data from changes while it is under privacy review.';
        }
#if not CLEANSCHEMA26
        field(720; "Coupled to CRM"; Boolean)
        {
            Caption = 'Coupled to Dataverse';
            Editable = false;
            ObsoleteReason = 'Replaced by flow field Coupled to Dataverse';
            ObsoleteState = Removed;
            ObsoleteTag = '26.0';
        }
#endif
        field(721; "Coupled to Dataverse"; Boolean)
        {
            FieldClass = FlowField;
            Caption = 'Coupled to Dataverse';
            ToolTip = 'Specifies that the salesperson/purchaser is coupled to a user in Dataverse.';
            Editable = false;
            CalcFormula = exist("CRM Integration Record" where("Integration ID" = field(SystemId), "Table ID" = const(Database::"Salesperson/Purchaser")));
        }
        field(5050; "Global Dimension 1 Code"; Code[20])
        {
            CaptionClass = '1,1,1';
            Caption = 'Global Dimension 1 Code';
            ToolTip = 'Specifies the code for the global dimension that is linked to the record or entry for analysis purposes. Two global dimensions, typically for the company''s most important activities, are available on all cards, documents, reports, and lists.';
            TableRelation = "Dimension Value".Code where("Global Dimension No." = const(1),
                                                          Blocked = const(false));

            trigger OnValidate()
            begin
                Rec.ValidateShortcutDimCode(1, "Global Dimension 1 Code");
            end;
        }
        field(5051; "Global Dimension 2 Code"; Code[20])
        {
            CaptionClass = '1,1,2';
            Caption = 'Global Dimension 2 Code';
            ToolTip = 'Specifies the code for the global dimension that is linked to the record or entry for analysis purposes. Two global dimensions, typically for the company''s most important activities, are available on all cards, documents, reports, and lists.';
            TableRelation = "Dimension Value".Code where("Global Dimension No." = const(2),
                                                          Blocked = const(false));

            trigger OnValidate()
            begin
                Rec.ValidateShortcutDimCode(2, "Global Dimension 2 Code");
            end;
        }
        field(5052; "E-Mail"; Text[80])
        {
            Caption = 'Email';
            ToolTip = 'Specifies the salesperson''s email address.';
            ExtendedDatatype = EMail;

            trigger OnValidate()
            var
                MailManagement: Codeunit "Mail Management";
            begin
                MailManagement.ValidateEmailAddressField("E-Mail");
                SetSearchEmail();
            end;
        }
        field(5053; "Phone No."; Text[30])
        {
            Caption = 'Phone No.';
            ToolTip = 'Specifies the salesperson''s telephone number.';
            ExtendedDatatype = PhoneNo;
        }
        field(5054; "Next Task Date"; Date)
        {
            CalcFormula = min("To-do".Date where("Salesperson Code" = field(Code),
                                                  Closed = const(false),
                                                  "System To-do Type" = filter(Organizer | "Salesperson Attendee")));
            Caption = 'Next Task Date';
            ToolTip = 'Specifies the date of the next task assigned to the salesperson.';
            Editable = false;
            FieldClass = FlowField;
        }
        field(5055; "No. of Opportunities"; Integer)
        {
            CalcFormula = count("Opportunity Entry" where("Salesperson Code" = field(Code),
                                                           Active = const(true),
                                                           "Estimated Close Date" = field("Date Filter"),
                                                           "Action Taken" = field("Action Taken Filter"),
                                                           "Sales Cycle Code" = field("Sales Cycle Filter"),
                                                           "Sales Cycle Stage" = field("Sales Cycle Stage Filter"),
                                                           "Probability %" = field("Probability % Filter"),
                                                           "Completed %" = field("Completed % Filter")));
            Caption = 'No. of Opportunities';
            ToolTip = 'Specifies the number of open opportunities handled by the salesperson.';
            Editable = false;
            FieldClass = FlowField;
        }
        field(5056; "Estimated Value (LCY)"; Decimal)
        {
            AutoFormatExpression = '';
            AutoFormatType = 1;
            CalcFormula = sum("Opportunity Entry"."Estimated Value (LCY)" where("Salesperson Code" = field(Code),
                                                                                 Active = const(true),
                                                                                 "Estimated Close Date" = field("Date Filter"),
                                                                                 "Action Taken" = field("Action Taken Filter"),
                                                                                 "Sales Cycle Code" = field("Sales Cycle Filter"),
                                                                                 "Sales Cycle Stage" = field("Sales Cycle Stage Filter"),
                                                                                 "Probability %" = field("Probability % Filter"),
                                                                                 "Completed %" = field("Completed % Filter")));
            Caption = 'Estimated Value (LCY)';
            Editable = false;
            FieldClass = FlowField;
        }
        field(5057; "Calcd. Current Value (LCY)"; Decimal)
        {
            AutoFormatExpression = '';
            AutoFormatType = 1;
            CalcFormula = sum("Opportunity Entry"."Calcd. Current Value (LCY)" where("Salesperson Code" = field(Code),
                                                                                      Active = const(true),
                                                                                      "Estimated Close Date" = field("Date Filter"),
                                                                                      "Action Taken" = field("Action Taken Filter"),
                                                                                      "Sales Cycle Code" = field("Sales Cycle Filter"),
                                                                                      "Sales Cycle Stage" = field("Sales Cycle Stage Filter"),
                                                                                      "Probability %" = field("Probability % Filter"),
                                                                                      "Completed %" = field("Completed % Filter")));
            Caption = 'Calcd. Current Value (LCY)';
            Editable = false;
            FieldClass = FlowField;
        }
        field(5058; "Date Filter"; Date)
        {
            Caption = 'Date Filter';
            FieldClass = FlowFilter;
        }
        field(5059; "No. of Interactions"; Integer)
        {
            CalcFormula = count("Interaction Log Entry" where("Salesperson Code" = field(Code),
                                                               Canceled = const(false),
                                                               Date = field("Date Filter"),
                                                               Postponed = const(false)));
            Caption = 'No. of Interactions';
            ToolTip = 'Specifies the number of interactions handled by this salesperson.';
            Editable = false;
            FieldClass = FlowField;
        }
        field(5060; "Cost (LCY)"; Decimal)
        {
            AutoFormatExpression = '';
            AutoFormatType = 1;
            CalcFormula = sum("Interaction Log Entry"."Cost (LCY)" where("Salesperson Code" = field(Code),
                                                                          Canceled = const(false),
                                                                          Date = field("Date Filter"),
                                                                          Postponed = const(false)));
            Caption = 'Cost (LCY)';
            Editable = false;
            FieldClass = FlowField;
        }
        field(5061; "Duration (Min.)"; Decimal)
        {
            AutoFormatType = 0;
            CalcFormula = sum("Interaction Log Entry"."Duration (Min.)" where("Salesperson Code" = field(Code),
                                                                               Canceled = const(false),
                                                                               Date = field("Date Filter"),
                                                                               Postponed = const(false)));
            Caption = 'Duration (Min.)';
            DecimalPlaces = 0 : 0;
            Editable = false;
            FieldClass = FlowField;
        }
        field(5062; "Job Title"; Text[30])
        {
            Caption = 'Job Title';
            ToolTip = 'Specifies the salesperson''s job title.';
        }
        field(5063; "Action Taken Filter"; Enum "Opportunity Action Taken")
        {
            Caption = 'Action Taken Filter';
            FieldClass = FlowFilter;
        }
        field(5064; "Sales Cycle Filter"; Code[10])
        {
            Caption = 'Sales Cycle Filter';
            FieldClass = FlowFilter;
            TableRelation = "Sales Cycle";
        }
        field(5065; "Sales Cycle Stage Filter"; Integer)
        {
            Caption = 'Sales Cycle Stage Filter';
            FieldClass = FlowFilter;
            TableRelation = "Sales Cycle Stage".Stage where("Sales Cycle Code" = field("Sales Cycle Filter"));
        }
        field(5066; "Probability % Filter"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Probability % Filter';
            DecimalPlaces = 1 : 1;
            FieldClass = FlowFilter;
            MaxValue = 100;
            MinValue = 0;
        }
        field(5067; "Completed % Filter"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Completed % Filter';
            DecimalPlaces = 1 : 1;
            FieldClass = FlowFilter;
            MaxValue = 100;
            MinValue = 0;
        }
        field(5068; "Avg. Estimated Value (LCY)"; Decimal)
        {
            AutoFormatExpression = '';
            AutoFormatType = 1;
            CalcFormula = average("Opportunity Entry"."Estimated Value (LCY)" where("Salesperson Code" = field(Code),
                                                                                     Active = const(true),
                                                                                     "Estimated Close Date" = field("Date Filter"),
                                                                                     "Action Taken" = field("Action Taken Filter"),
                                                                                     "Sales Cycle Code" = field("Sales Cycle Filter"),
                                                                                     "Sales Cycle Stage" = field("Sales Cycle Stage Filter"),
                                                                                     "Probability %" = field("Probability % Filter"),
                                                                                     "Completed %" = field("Completed % Filter")));
            Caption = 'Avg. Estimated Value (LCY)';
            Editable = false;
            FieldClass = FlowField;
        }
        field(5069; "Avg.Calcd. Current Value (LCY)"; Decimal)
        {
            AutoFormatExpression = '';
            AutoFormatType = 1;
            CalcFormula = average("Opportunity Entry"."Calcd. Current Value (LCY)" where("Salesperson Code" = field(Code),
                                                                                          Active = const(true),
                                                                                          "Estimated Close Date" = field("Date Filter"),
                                                                                          "Action Taken" = field("Action Taken Filter"),
                                                                                          "Sales Cycle Code" = field("Sales Cycle Filter"),
                                                                                          "Sales Cycle Stage" = field("Sales Cycle Stage Filter"),
                                                                                          "Probability %" = field("Probability % Filter"),
                                                                                          "Completed %" = field("Completed % Filter")));
            Caption = 'Avg.Calcd. Current Value (LCY)';
            Editable = false;
            FieldClass = FlowField;
        }
        field(5070; "Contact Filter"; Code[20])
        {
            Caption = 'Contact Filter';
            FieldClass = FlowFilter;
            TableRelation = Contact;
        }
        field(5071; "Contact Company Filter"; Code[20])
        {
            Caption = 'Contact Company Filter';
            FieldClass = FlowFilter;
            TableRelation = Contact where(Type = const(Company));
        }
        field(5072; "Campaign Filter"; Code[20])
        {
            Caption = 'Campaign Filter';
            FieldClass = FlowFilter;
            TableRelation = Campaign;
        }
        field(5073; "Estimated Value Filter"; Decimal)
        {
            AutoFormatExpression = '';
            AutoFormatType = 1;
            Caption = 'Estimated Value Filter';
            FieldClass = FlowFilter;
        }
        field(5074; "Calcd. Current Value Filter"; Decimal)
        {
            AutoFormatExpression = '';
            AutoFormatType = 1;
            Caption = 'Calcd. Current Value Filter';
            FieldClass = FlowFilter;
        }
        field(5075; "Chances of Success % Filter"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Chances of Success % Filter';
            DecimalPlaces = 0 : 0;
            FieldClass = FlowFilter;
            MaxValue = 100;
            MinValue = 0;
        }
        field(5076; "Task Status Filter"; Enum "Task Status")
        {
            Caption = 'Task Status Filter';
            FieldClass = FlowFilter;
        }
        field(5077; "Closed Task Filter"; Boolean)
        {
            Caption = 'Closed Task Filter';
            FieldClass = FlowFilter;
        }
        field(5078; "Priority Filter"; Option)
        {
            Caption = 'Priority Filter';
            FieldClass = FlowFilter;
            OptionCaption = 'Low,Normal,High';
            OptionMembers = Low,Normal,High;
        }
        field(5079; "Team Filter"; Code[10])
        {
            Caption = 'Team Filter';
            FieldClass = FlowFilter;
            TableRelation = Team;
        }
        field(5082; "Opportunity Entry Exists"; Boolean)
        {
            CalcFormula = exist("Opportunity Entry" where("Salesperson Code" = field(Code),
                                                           Active = const(true),
                                                           "Contact No." = field("Contact Filter"),
                                                           "Contact Company No." = field("Contact Company Filter"),
                                                           "Sales Cycle Code" = field("Sales Cycle Filter"),
                                                           "Sales Cycle Stage" = field("Sales Cycle Stage Filter"),
                                                           "Campaign No." = field("Campaign Filter"),
                                                           "Action Taken" = field("Action Taken Filter"),
                                                           "Estimated Value (LCY)" = field("Estimated Value Filter"),
                                                           "Calcd. Current Value (LCY)" = field("Calcd. Current Value Filter"),
                                                           "Completed %" = field("Completed % Filter"),
                                                           "Chances of Success %" = field("Chances of Success % Filter"),
                                                           "Probability %" = field("Probability % Filter"),
                                                           "Estimated Close Date" = field("Date Filter"),
                                                           "Close Opportunity Code" = field("Close Opportunity Filter")));
            Caption = 'Opportunity Entry Exists';
            Editable = false;
            FieldClass = FlowField;
        }
        field(5083; "Task Entry Exists"; Boolean)
        {
            CalcFormula = exist("To-do" where("Salesperson Code" = field(Code),
                                               "Contact No." = field("Contact Filter"),
                                               "Contact Company No." = field("Contact Company Filter"),
                                               "Campaign No." = field("Campaign Filter"),
                                               "Team Code" = field("Team Filter"),
                                               Status = field("Task Status Filter"),
                                               Closed = field("Closed Task Filter"),
                                               Priority = field("Priority Filter"),
                                               Date = field("Date Filter")));
            Caption = 'Task Entry Exists';
            Editable = false;
            FieldClass = FlowField;
        }
        field(5084; "Close Opportunity Filter"; Code[10])
        {
            Caption = 'Close Opportunity Filter';
            FieldClass = FlowFilter;
            TableRelation = "Close Opportunity Code";
        }
        field(5085; "Search E-Mail"; Code[80])
        {
            Caption = 'Search Email';
        }
        field(5086; "E-Mail 2"; Text[80])
        {
            Caption = 'Email 2';
            ExtendedDatatype = EMail;

            trigger OnValidate()
            var
                MailManagement: Codeunit "Mail Management";
            begin
                MailManagement.ValidateEmailAddressField("E-Mail 2");
            end;
        }
        field(5087; Blocked; Boolean)
        {
            Caption = 'Blocked';
            ToolTip = 'Specifies whether this Salesperson can be assigned for new documents';
        }
    }

    keys
    {
        key(Key1; "Code")
        {
            Clustered = true;
        }
        key(Key2; "Search E-Mail")
        {
        }
        key(Key3; SystemModifiedAt)
        {
        }
    }

    fieldgroups
    {
        fieldgroup(DropDown; "Code", Name)
        {
        }
        fieldgroup(Brick; "Code", Name, Image)
        {
        }
    }

    trigger OnDelete()
    var
        CustomerLedgEntry: Record "Cust. Ledger Entry";
        TeamSalesperson: Record "Team Salesperson";
        TodoTask: Record "To-do";
        Opportunity: Record Opportunity;
        VendorLedgEntry: Record "Vendor Ledger Entry";
    begin
        CustomerLedgEntry.Reset();
        CustomerLedgEntry.SetRange("Salesperson Code", Code);
        if not CustomerLedgEntry.IsEmpty() then
            Error(CannotDeleteBecauseCustLedgerEntriesErr, Code);

        VendorLedgEntry.Reset();
        VendorLedgEntry.SetRange("Purchaser Code", Code);
        if not VendorLedgEntry.IsEmpty() then
            Error(CannotDeleteBecauseVendLedgerEntriesErr, Code);

        TodoTask.Reset();
        TodoTask.SetCurrentKey("Salesperson Code", Closed);
        TodoTask.SetRange("Salesperson Code", Code);
        TodoTask.SetRange(Closed, false);
        if not TodoTask.IsEmpty() then
            Error(CannotDeleteBecauseActiveTasksErr, Code);

        Opportunity.SetRange("Salesperson Code", Code);
        Opportunity.SetRange(Closed, false);
        if not Opportunity.IsEmpty() then
            Error(CannotDeleteBecauseActiveOpportunitiesErr, Code);

        TeamSalesperson.Reset();
        TeamSalesperson.SetRange("Salesperson Code", Code);
        TeamSalesperson.DeleteAll();
        DimMgt.DeleteDefaultDim(DATABASE::"Salesperson/Purchaser", Code);
    end;

    trigger OnInsert()
    begin
        Validate(Code);
        SetSearchEmail();
        DimMgt.UpdateDefaultDim(
          DATABASE::"Salesperson/Purchaser", Code,
          "Global Dimension 1 Code", "Global Dimension 2 Code");
    end;

    trigger OnModify()
    begin
        Validate(Code);
        SetSearchEmail();
    end;

    trigger OnRename()
    begin
        DimMgt.RenameDefaultDim(DATABASE::"Salesperson/Purchaser", xRec.Code, Code);
    end;

    var
        DimMgt: Codeunit DimensionManagement;
        PostActionTxt: Label 'post';
        CreateActionTxt: Label 'create';
        SalespersonTxt: Label 'Salesperson';
        PurchaserTxt: Label 'Purchaser';
        CannotDeleteBecauseActiveTasksErr: Label 'You cannot delete the salesperson/purchaser with code %1 because it has open tasks.', Comment = '%1 = Salesperson/Purchaser code.';
        BlockedSalesPersonPurchErr: Label 'You cannot %1 this document because %2 %3 is blocked due to privacy.', Comment = '%1 = post or create, %2 = Salesperson / Purchaser, %3 = salesperson / purchaser code.';
        PrivacyBlockedGenericTxt: Label 'Privacy Blocked must not be true for %1 %2.', Comment = '%1 = Salesperson / Purchaser, %2 = salesperson / purchaser code.';
        CannotDeleteBecauseActiveOpportunitiesErr: Label 'You cannot delete the salesperson/purchaser with code %1 because it has open opportunities.', Comment = '%1 = Salesperson/Purchaser code.';
        CannotDeleteBecauseVendLedgerEntriesErr: Label 'The salesperson/purchaser %1 cannot be deleted because vendor ledger entries exist.', Comment = '%1 = Salesperson/Purchaser code.';
        CannotDeleteBecauseCustLedgerEntriesErr: Label 'The salesperson/purchaser %1 cannot be deleted because customer ledger entries exist.', Comment = '%1 = Salesperson/Purchaser code.';

    procedure CreateInteraction()
    var
        TempSegmentLine: Record "Segment Line" temporary;
    begin
        TempSegmentLine.CreateInteractionFromSalesperson(Rec);
    end;

    procedure ValidateShortcutDimCode(FieldNumber: Integer; var ShortcutDimCode: Code[20])
    begin
        OnBeforeValidateShortcutDimCode(Rec, xRec, FieldNumber, ShortcutDimCode);

        DimMgt.ValidateDimValueCode(FieldNumber, ShortcutDimCode);
        if not IsTemporary then begin
            DimMgt.SaveDefaultDim(DATABASE::"Salesperson/Purchaser", Code, FieldNumber, ShortcutDimCode);
            Modify();
        end;

        OnAfterValidateShortcutDimCode(Rec, xRec, FieldNumber, ShortcutDimCode);
    end;

    procedure GetPrivacyBlockedTransactionText(SalespersonPurchaser2: Record "Salesperson/Purchaser"; IsPostAction: Boolean; IsSalesperson: Boolean): Text[150]
    var
        "Action": Text[30];
        Type: Text[20];
    begin
        if IsPostAction then
            Action := PostActionTxt
        else
            Action := CreateActionTxt;
        if IsSalesperson then
            Type := SalespersonTxt
        else
            Type := PurchaserTxt;
        exit(StrSubstNo(BlockedSalesPersonPurchErr, Action, Type, SalespersonPurchaser2.Code));
    end;

    procedure GetPrivacyBlockedGenericText(SalespersonPurchaser2: Record "Salesperson/Purchaser"; IsSalesperson: Boolean): Text[150]
    var
        Type: Text[20];
    begin
        if IsSalesperson then
            Type := SalespersonTxt
        else
            Type := PurchaserTxt;
        exit(StrSubstNo(PrivacyBlockedGenericTxt, Type, SalespersonPurchaser2.Code));
    end;

    procedure VerifySalesPersonPurchaserPrivacyBlocked(SalespersonPurchaser2: Record "Salesperson/Purchaser"): Boolean
    begin
        if SalespersonPurchaser2."Privacy Blocked" then
            exit(true);
        exit(false);
    end;

    local procedure SetSearchEmail()
    begin
        if "Search E-Mail" <> "E-Mail".ToUpper() then
            "Search E-Mail" := "E-Mail";
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterValidateShortcutDimCode(var SalespersonPurchaser: Record "Salesperson/Purchaser"; var xSalespersonPurchaser: Record "Salesperson/Purchaser"; FieldNumber: Integer; var ShortcutDimCode: Code[20])
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateShortcutDimCode(var SalespersonPurchaser: Record "Salesperson/Purchaser"; var xSalespersonPurchaser: Record "Salesperson/Purchaser"; FieldNumber: Integer; var ShortcutDimCode: Code[20])
    begin
    end;
}