import { DataTable } from "./DataTable";
import { Guid } from "./Guid";
import { WhoAmIResponse } from "./Messages";
import { EntityMetadata } from "./CRMDataTypes";
export declare class CRMClient {
    connectionString: string;
    private _crmBridge;
    /**
     * Default constructor
     * @classdesc Allow access to CRM functions. Contains the functions to interact with CRM services.
     * @class CRMClient
     * @param {string} connectionString Optional. A valid connection string or connection string name.
     * The connection string can be either a valid connection string or a name of an existing connection string in the file "config.json" at the root path of your application.
     * If no value is passed to the constructor, the "default" text will be assumed, which means that a connection string named "default" will be used.
     * @see {@link https://msdn.microsoft.com/en-ie/library/mt608573.aspx} for further information
     *
     * @example <caption>config.json file format</caption>
     * {
     *      "connectionStrings":
     *      {
     *          "default":"AuthType=Office365; Url=http://crm.contoso.com/xrmContoso; Domain=CONTOSO; Username=jsmith; Password=passcode",
     *          "connection2":"AuthType=AD; Url=http://crm.contoso.com/xrmContoso"
     *      }
     * }
     * @example <caption>Create a connection using a valid Connection String</caption>
     * var crm = new CRMClient("AuthType=Office365; Url=http://crm.contoso.com/xrmContoso; Domain=CONTOSO; Username=jsmith; Password=passcode");
     * @example <caption>Create a connection using the connection string named "connection2" specified in the config.json file</caption>
     * var crm = new CRMClient("connection2");
     * @example <caption>Create a connection using the connection string named "default" specified in the config.json file</caption>
     * var crm = new CRMClient();
     * @example <caption>Create a connection using the connection string named "default" specified in the config.json file</caption>
     * var crm = new CRMClient("default");
     */
    constructor(connectionString?: string, fakeBridge?: boolean);
    /**
     * Gets the bridge object between node and .net
     * @private
     * @method CRMClient#getBridge
     * @param fakeBridge {boolean} indicates if a fake bridge whants to be retrieved
     * @returns a .net bridge that allows node to interact with .net
     */
    private getBridge(fakeBridge);
    private tryGetModule(moduleId);
    private convert(propertiesArray);
    /**
    * Returns information about the current user. Useful for testing the active connection.
    * @returns a {@link WhoAmIResponse} object with the information about the authenticated user in CRM.
    * @method CRMClient#whoAmI
    * @example <caption>Returns information about the current user</caption>
    * var who = crm.whoAmI();
    * console.log(who.BusinessUnitId); // prints 6fefeb79-5447-e511-a5db-0050568a69e2
    * console.log(who.OrganizationId); // prints 2b476bd1-aaed-43ee-b386-eee0f1b87207
    * console.log(who.UserId); // prints 9ba35c25-b892-4f8a-b124-3920d9873af4
    */
    whoAmI(): WhoAmIResponse;
    /**
     * Tests the active connection. Throws an exception if there's any error.
     * The method performs a {@link WhoAmIRequest}.
     * @method CRMClient#testConnection
     * @see CRMClient#whoAmI
     */
    testConnection(): void;
    /**
     * Retrieves one single record from CRM.
     * @method CRMClient#retrieve
     * @param entityName {string} Name of the entity to be retrieved. The name is case insensitive, so all values are lowercased before being sent to CRM.
     * @param idOrConditions {string|Guid|object} Either a string with the GUID if the record to be retrieved, a {@link Guid} object with the same value, or a conditions object that returns only one record.
     * Learn how to write condition objects: {@link Fetch#setFilter}
     * @param attributes {string|string[]|boolean} Optional. Either an attribute name, an array of attributes, or a true value indicating that all attributes must be retrieved. The default value is true. An ***** value has the same effect
     *
     * @returns A javascript object containing the values of the record. If no data found, then a null object is returned.
     *
     * @example <caption>Return all the columns for the specified account id</caption>
     * var account = crm.retrieve("account","6fefeb79-5447-e511-a5db-0050568a69e2");
     * console.log(account);
     * @example <caption>Return all the columns for the specified account id</caption>
     * var account = crm.retrieve("account","6fefeb79-5447-e511-a5db-0050568a69e2","*");
     * console.log(account);
     * @example <caption>Return all the columns for the specified account id</caption>
     * var account = crm.retrieve("account","6fefeb79-5447-e511-a5db-0050568a69e2",true);
     * console.log(account);
     * @example <caption>You can use the Guid class to specify the id parameter. This allows to perform a GUID format validation before calling the method.</caption>
     * var Guid = require("dynamicsnode").Guid;
     * var account = crm.retrieve("account",new Guid("6fefeb79-5447-e511-a5db-0050568a69e2"));
     * console.log(account);
     * @example <caption>Get the accountid,name,ownerid,createdon columns for the given account id</caption>
     * var account = crm.retrieve("account","6fefeb79-5447-e511-a5db-0050568a69e2",["accountid","name","ownerid","createdon"]);
     * console.log(account);
     * @example <caption>Get the name of the specified account</caption>
     * var account = crm.retrieve("account","6fefeb79-5447-e511-a5db-0050568a69e2","name");
     * console.log(account.name);
     * @example <caption>Accessing information about a related record</caption>
     * var account = crm.retrieve("account","6fefeb79-5447-e511-a5db-0050568a69e2","ownerid");
     * console.log(account.ownerid); // outputs the GUID value
     * console.log(account.ownerid_type); // outputs systemuser
     * console.log(account.ownerid_name); // outputs John Doe
     * @example <caption>Returns an account using a condition object. If there are more than one account named "Acme" then an exception will be thrown</caption>
     * var account = crm.retrieve("account",{name:"Acme"});
     * console.log(account.name);
     */
    retrieve(entityName: string, idOrConditions: string | Guid | Object, pColumns?: string | string[] | boolean): any;
    retrieveMultiple(fetchXml: string): DataTable;
    retrieveMultiple(entityName: string, conditions?: any, attributes?: boolean | string | string[]): DataTable;
    /** It is a simpified way of retrieving all the existing records of an entity. Is equivalent to call the {@link CRMClient#retrieveMultiple} method not specifying the conditions or attributes method
     * @method CRMClient#retrieveAll
     * @param entityName {string} Name of the entity which records you want to retrieve.
     * @returns {DataTable} {@link DataTable} object with the records found.
     * @example <caption>Retrieve all existing account records</caption>
     * var accounts = crm.retrieveAll("account");
    */
    retrieveAll(entityName: string): DataTable;
    /**
     * Creates a record in CRM. The names in the entity or attributes are case insensitive, so all the names will be lowercased before
     * send the operation to Crm.
     * @method CRMClient#create
     * @param entityName {string} The name of the entity which record you want to create
     * @param attributes {object} Javascript object with the values the new record will have.
     *
     * @returns {string} GUID of the record created.
     */
    create(entity: string, attributes: Object): string;
    /**
     * Creates a record in CRM. The names in the entity or attributes are case insensitive, so all the names will be lowercased before
     * send the operation to Crm.
     * @method CRMClient#create
     * @param entityName {string} The name of the entity which record you want to create
     * @param attributes {object} Javascript object with the values the new record will have.
     *
     * @returns {string} GUID of the record created.
     */
    create(data: DataTable): void;
    private createInternal(entityName, attributes);
    private ConvertToEntity(entityName, attributes);
    private ConvertToString(attributeName, attributeValue);
    private ConvertToPartyList(attributeValue, attributeMetadata);
    private ConvertToDate(attributeValue, attributeMetadata);
    private ConvertToBoolean(attributeValue, attributeMetadata);
    private ConvertToOptionset(attributeValue, attributeMetadata);
    private ConvertToEntityReference(attributeValue, attributeMetadata);
    /**
     * Deletes one on more records in CRM, and returns the number of records affected.
     * @method CRMClient#delete
     * @param entityName {string} Name of the entity which record you want to delete
     * @param idsOrConditions {string|Guid|string[]|object} Can be either a Guid, a string, an array or a conditions object.
     * If it is Guid will delete the record with the specified id.
     * If it is a string, must be a Guid value, and again, will delete the records matching the specified id.
     * If the parameter is an array, each element in it must be either a string or a Guid, and in each case, the records deleted will be the ones specified by these Guids.
     * If it is a condition object, first, all the matching records will be retrieved, and then deleted.
     * Learn how to write condition objects: {@link Fetch#setFilter}
     * @returns {number} Number of records deleted
     * @example <caption>Delete an account with a known Guid</caption>
     * var affectedRecords = crm.delete("account","6fefeb79-5447-e511-a5db-0050568a69e2");
     * @example <caption>Delete an account with a known Guid. A validation of the Guid format will be performed before calling to the method.</caption>
     * var affectedRecords = crm.delete("account",new Guid("6fefeb79-5447-e511-a5db-0050568a69e2"));
     * @example <caption>Delete several account records at once</caption>
     * var affectedRecords = crm.delete("account",["6fefeb79-5447-e511-a5db-0050568a69e2","6fefeb79-5447-e511-a5db-0050568a69e2");
     * @example <caption>Delete all existing accounts named "contoso"</caption>
     * var affectedRecords = crm.delete("account",{name:"contoso"});
     */
    delete(entityName: string, idsOrConditions: any): number;
    private deleteMultiple(entityName, ids);
    /**
     * Updates one or more records that meet the specified conditions and returns the number of updated records.
     * @method CRMClient#update
     * @param entityName {string} The name of the entity which record you want to update.
     * @param attributes {object} Javascript object with the values the new record will have.
     * @param conditions {opbject} Optional. Javascript condition object with the filter values that is going to be used to know which records are going to be updated.
     * If you omit this parameter, then you have to provide the record GUID in the attributes parameter.
     * Learn how to write condition objects: {@link Fetch#setFilter}
     * @returns {number} Number of modified records
     *
     * @example <caption>Updates all the accounts which name is contoso, and set the attribute value to "contoso-updated"</caption>
     * var affectedRecords = crm.update("account",{name:"contoso-updated"},{name:"contoso"})
     * @example <caption>In this example, only the account with the specified account id will be updated. If the specified record id exists, then affectedRecords will be equals to 1.</caption>
     * var affectedRecords = crm.update("account",{accountid:"6fefeb79-5447-e511-a5db-0050568a69e2",name:"contoso-updated"})
     */
    update(entityName: string, attributes: any, conditions?: any): number;
    getIdField(entityName: string): string;
    /** Takes a list of attributes and values, tries to find an existing record with those values in CRM, if it exists,
     * then performs an update, otherwhise it creates it.
     * @method CRMClient#createOrUpdate
     * @param entityName {string} Name of the entity which record you want to update.
     * @param attributes {object} Javascript object with the attributes you want to create or update.
     * @param matchFields {string[]} List of fields in the attributes parameter you want to use to know if the record exists in CRM.
     * The attributes specified in this parameter will be used to perform a {@link CRMClient#retrieve}.
     * @example <caption>Create an account named "contoso". In this case, a retrieve of an account with name="contoso" will be performed.
     * If exists, then the name and description will be updated. If it doesn't exist, then the account will be created with the specified
     * name and description. If theres more than one account with that name, an exception will be thrown</caption>
     * crm.createOrUpdate("account",{name:"contoso", description:"Account Updated"},["name"]);
     * @example <caption>Searches for an account named "contoso" owned by me. If exists, it updates it, otherwhise it creates a new one.</caption>
     * var me = crm.whoAmI().UserId;
     * crm.createOrUpdate("account",{name:"contoso", description:"Account Updated", ownerid:me},["name","ownerid"]);
    */
    createOrUpdate(entityName: string, attributes: any, matchFields: string[]): void;
    /** For every record in the specified Table, tries to find out if it does exists, and if doesn't it creates it.
     * @method CRMClient#createIfDoesNotExist
     * @param data {DataTable} DataTable with the entity name and the records to create in CRM.
     * @param matchFields {string[]} List of fields in the attributes parameter you want to use to know if the record exists in CRM.
     * The attributes specified in this parameter will be used to perform a {@link CRMClient#retrieve}.
     * @example <caption>Loads a list of accounts from an Excel file and creates only the ones that don't exist already in CRM.
     * It uses the email address to know if the account exists or not.</caption>
     * var accountsToLoad = DataTable.load("AccountsToLoad.xlsx");
     * crm.createIfDoesNotExist(accountsToLoad,["emailaddress1"]);
    */
    createIfDoesNotExist(data: DataTable, matchFields: string[]): void;
    /** Takes a list of attributes and values, tries to find an existing record with those values in CRM, and if doesn't exists it creates it.
     * @method CRMClient#createIfDoesNotExist
     * @param entityName {string} Name of the entity which record you want to create.
     * @param attributes {object} Javascript object with the attributes you want to create.
     * @param matchFields {string[]} List of fields in the attributes parameter you want to use to know if the record exists in CRM.
     * The attributes specified in this parameter will be used to perform a {@link CRMClient#retrieve}.
     * @example <caption>Create an account named "contoso" only if it doesn't exist one already with the specified email.
     * If theres more than one account with that email, an exception will be thrown</caption>
     * crm.createIfDoesNotExist("account",{name:"contoso", description:"New Account Created", emailaddress1:"info@contoso.com"},["emailaddress1"]);
     * @example <caption>Searches for an account named "contoso" owned by me. If it doesn't exist, it creates it.</caption>
     * var me = crm.whoAmI().UserId;
     * crm.createIfDoesNotExist("account",{name:"contoso", description:"Account Updated", ownerid:me},["name","ownerid"]);
    */
    createIfDoesNotExist(entityName: string, attributes: Object, matchFields: string[]): void;
    private createUpdate(entityName, attributes, matchFields, update?);
    /** */
    associateData(data: DataTable): void;
    associate(fromEntityName: string, fromEntityId: string | Guid, relationshipName: string, toEntityName: string, toEntityId: string | Guid): void;
    disassociateData(data: DataTable): void;
    disassociate(fromEntityName: string, fromEntityId: string | Guid, relationshipName: string, toEntityName: string, toEntityId: string | Guid): void;
    /** Gets metadata information for a particular CRM Entity.
     * @method CRMClient#getEntityMetadata
     * @param entityName {string} Name of the entity which metadata information you want to get
     * @example <caption>Retrieve metadata information of the account entity</caption>
     * var metadata = crm.getEntityMetadata("account");
     */
    getEntityMetadata(entityName: string): EntityMetadata;
    Execute(request: any): any;
    assign(targetId: Guid | string, targetType: string, assigneeId: Guid | string, assigneeType?: string): void;
    export(entityName: string, fileName: string): void;
    import(fileName: string): void;
    /** Sets the state and status of a record.
     * @method CRMClient#setState
     * @param entityName {string} Name of the entity which state or status you want to set
     * @param entityId {Guid|string} GUID of the record which state or status you want to set
     * @param state {number|string} Name or Value of the State you want to set
     * @param status {number|string} Name or Value of the Status you want to set
     * @example <caption>Set the state of a task to Completed (1) and the Status to Completed (5)</caption>
     * crm.setState('task','6fefeb79-5447-e511-a5db-0050568a69e2',1,5);
     * @example <caption>Set the state of a task using the text values</caption>
     * crm.setState('task','6fefeb79-5447-e511-a5db-0050568a69e2','Completed','Completed');
     * */
    setState(entityName: string, entityId: Guid | string, state: number | string, status: number | string): void;
}
