import { EntityId, IsoDatetime, Username, Amount, Tag, AssetSymbol, IntegerPositiveStrict } from '../Foundations';
export declare type Policy = {
    id: EntityId;
    version: string;
    activityKind: PolicyActivityKind;
    tags?: Tag[];
    dateCreated: IsoDatetime;
    isImmutable: boolean;
    orgId: EntityId;
    description?: string;
    author: Username;
    name?: string;
    status: PolicyStatus;
    controlIds: EntityId[];
    ruleIds: EntityId[];
    filter?: PolicyObjectFilter;
};
export declare type NotifyAndAuditPcConf = {
    kind: PolicyControlKind.NotifyAndAudit;
    usernames?: string[];
    groups?: string[];
};
export declare type RequestApprovalPcConf = {
    kind: PolicyControlKind.RequestApproval;
    approverGroups?: string[];
    approverUsernames?: string[];
    numApprovals: number;
    timeoutInMinutes?: IntegerPositiveStrict;
};
export declare type PolicyRule = {
    id: EntityId;
    version: string;
    kind: PolicyRuleKind;
    tags?: Tag[];
    dateCreated: IsoDatetime;
    isImmutable: boolean;
    orgId: EntityId;
    author: Username;
    description?: string;
    name?: string;
    configuration: PolicyRuleConfiguration;
    status: PolicyRuleStatus;
};
export declare type PolicyControl = {
    id: EntityId;
    version: string;
    kind: PolicyControlKind;
    tags?: Tag[];
    dateCreated: IsoDatetime;
    isImmutable: boolean;
    orgId: EntityId;
    author: Username;
    description?: string;
    name?: string;
    /**
     * Indicates whether control should merge with same one (compared by values).
     * This property should not be set to true, unless outcomes are understood. For example: Let's say we have 3 policies:
     *
     * 1. policy to require approval for payments over €5000
     * 1. policy to require approval for payments done out of office hours
     * 1. policy to require approval for payments done out of Geofence.
     *
     * In this case policies will require 3 approvals combined, which might not be an intent, and only one approval is required.
     */
    shouldMergeWithSameControl: boolean;
    configuration: PolicyControlConfiguration;
    status: PolicyControlStatus;
};
export declare type CreateAmountLimitPrConf = {
    kind: PolicyRuleKind.PaymentAmountLimit;
    limit: Amount;
    assetSymbol: AssetSymbol;
    shouldIgnoreAssetsWithoutMarketValue: boolean;
};
export declare type UpdateAmountLimitPrConf = {
    limit?: Amount;
    assetSymbol?: AssetSymbol;
    shouldIgnoreAssetsWithoutMarketValue?: boolean;
};
export declare type CreateOutgoingVelocityPrConf = {
    kind: PolicyRuleKind.PaymentAmountOutgoingVelocity;
    velocity: Amount;
    assetSymbol: AssetSymbol;
    intervalInMinutes: number;
    shouldIgnoreAssetsWithoutMarketValue: boolean;
};
export declare type CreateSiphoningPrConf = {
    kind: PolicyRuleKind.Siphoning;
    maxTxCount: number;
    intervalInMinutes: number;
};
export declare type SiphoningPrConf = {
    maxTxCount: number;
    intervalInMinutes: number;
};
export declare type UpdateSiphoningPrConf = {
    maxTxCount?: number;
    intervalInMinutes?: number;
};
export declare type AmountLimitPrConf = {
    limit: Amount;
    assetSymbol: AssetSymbol;
    shouldIgnoreAssetsWithoutMarketValue: boolean;
};
export declare type UpdateOutgoingVelocityPrConf = {
    velocity?: Amount;
    assetSymbol?: AssetSymbol;
    intervalInMinutes?: number;
    shouldIgnoreAssetsWithoutMarketValue?: boolean;
};
export declare type OutgoingVelocityPrConf = {
    velocity: Amount;
    assetSymbol: AssetSymbol;
    intervalInMinutes: number;
    shouldIgnoreAssetsWithoutMarketValue: boolean;
};
export declare type CreateRequestApprovalPcConf = {
    kind: PolicyControlKind.RequestApproval;
    approverUsernames?: string[];
    approverGroups?: string[];
    timeoutInMinutes?: IntegerPositiveStrict;
    numApprovals: number;
};
export declare type UpdateRequestApprovalPcConf = {
    approverUsernames?: string[];
    approverGroups?: string[];
    timeoutInMinutes?: number;
    numApprovals?: number;
};
export declare type CreateNotifyAndAuditPcConf = {
    kind: PolicyControlKind.NotifyAndAudit;
    usernames?: string[];
    groups?: string[];
};
export declare type UpdateNotifyAndAuditPcConf = {
    groups?: string[];
    usernames?: string[];
};
export declare type PolicyManagementPreferences = {
    /**
     * Sets default `AssetSymbol` for the policy rules that use it, such as Limit, Velocity, Siphoning, and others.
     */
    policyRuleAssetSymbol?: boolean;
    /**
     * Sets default interval in minutes for policy rules that use intervals, such as Velocity and Siphoning.
     *
     * This setting does not update existing rules. This will only impact rules that are created  after this setting is set.
     */
    policyRuleVelocityIntervalInMinutes?: number;
};
export declare type Create = {};
export declare type EmptyConfiguration = {};
export declare type CreateAlwaysActivatedPrConf = {
    kind: PolicyRuleKind.AlwaysActivated;
};
export declare type UpdateAlwaysActivatedPrConf = {};
export declare type AssetAccountFilter = {
    kind: PolicyObjectFilterKind.AssetAccount;
    assetAccountIds?: EntityId[];
    tags?: Tag[];
    assetSymbols?: string[];
};
export declare type PublicKeyFilter = {
    kind: PolicyObjectFilterKind.PublicKey;
    publicKeyIds?: EntityId[];
    tags?: string[];
};
export declare type CreatePolicyInput = {
    activityKind: PolicyActivityKind;
    isImmutable: boolean;
    description: string;
    name?: string;
    controlIds: EntityId[];
    ruleIds: EntityId[];
    status: PolicyStatus;
    filter?: PolicyObjectFilter;
};
export declare type UpdatePolicyInput = {
    description?: string;
    controlIds?: EntityId[];
    ruleIds?: EntityId[];
    status?: PolicyStatus;
    filter?: PolicyObjectFilter;
};
export declare type CreatePolicyControlInput = {
    description?: string;
    name?: string;
    configuration: CreatePolicyControlConfiguration;
};
export declare type UpdatePolicyControlInput = {
    description?: string;
    name?: string;
    configuration?: UpdatePolicyControlConfiguration;
};
export declare type CreatePolicyRuleInput = {
    description?: string;
    name?: string;
    configuration: CreatePolicyRuleConfiguration;
};
export declare type UpdatePolicyRuleInput = {
    description?: string;
    name?: string;
    configuration: UpdatePolicyRuleConfiguration;
};
export declare type CreatePolicyRuleConfiguration = CreateAmountLimitPrConf | CreateOutgoingVelocityPrConf | CreateSiphoningPrConf | CreateAlwaysActivatedPrConf;
export declare type UpdatePolicyRuleConfiguration = UpdateAmountLimitPrConf | UpdateSiphoningPrConf | UpdateOutgoingVelocityPrConf | UpdateAlwaysActivatedPrConf;
export declare type UpdatePolicyControlConfiguration = UpdateRequestApprovalPcConf | UpdateNotifyAndAuditPcConf;
export declare type CreatePolicyControlConfiguration = CreateRequestApprovalPcConf | CreateNotifyAndAuditPcConf;
export declare type PolicyRuleConfiguration = SiphoningPrConf | AmountLimitPrConf | OutgoingVelocityPrConf | OutgoingVelocityPrConf | EmptyConfiguration;
export declare type PolicyControlConfiguration = NotifyAndAuditPcConf | RequestApprovalPcConf;
export declare type PolicyObjectFilter = AssetAccountFilter | PublicKeyFilter;
export declare enum PolicyActivityKind {
    PaymentInitiation = "PaymentInitiation",
    AddingEmployee = "AddingEmployee",
    UpdatingEmployeeDetails = "UpdatingEmployeeDetails",
    RemovingEmployee = "RemovingEmployee",
    CreatingSignature = "CreatingSignature",
    TransactionInitiation = "TransactionInitiation"
}
export declare enum PolicyStatus {
    Enabled = "Enabled",
    Disabled = "Disabled",
    Archived = "Archived"
}
/**
 * enumm:
 * * NotifyAndAudit
 * * RequestApproval
 */
export declare enum PolicyControlKind {
    NotifyAndAudit = "NotifyAndAudit",
    RequestApproval = "RequestApproval"
}
export declare enum PolicyRuleKind {
    PaymentAmountLimit = "PaymentAmountLimit",
    EmployeeAdded = "EmployeeAdded",
    EmployeeDetailsUpdated = "EmployeeDetailsUpdated",
    Siphoning = "Siphoning",
    AlwaysActivated = "AlwaysActivated",
    PaymentAmountOutgoingVelocity = "PaymentAmountOutgoingVelocity"
}
export declare enum PolicyControlStatus {
    Enabled = "Enabled",
    Archived = "Archived"
}
export declare enum PolicyRuleStatus {
    Enabled = "Enabled",
    Archived = "Archived"
}
export declare enum PolicyObjectFilterKind {
    AssetAccount = "AssetAccount",
    PublicKey = "PublicKey"
}
