Friday, November 24, 2017

101 Most Used Dynamics 365 CRM code snippets

Here is an inventory of most used code snippet utilized in Dynamics 365 CRM.remember to add required namespace whenever required while inserting code. Hold the CRM SDK folder able to take the reference of the assemblies for beneath namespace.
  • Code to join organization (C#) String userName = ""; String userPwd = ""; String userDomain= ""; String crmServer = ""; String crmPort = ";"; String crmOrg = ""; String homeRealm = ""; NetworkCredential netCred = new system.internet.NetworkCredential(userName, userPwd, userDomain, homeRealm); CrmServiceClient crmSvc = new CrmServiceClient(netCred, crmServer, crmPort, crmOrg);
  • Derive Context, CRM service object in Plugin (C#) IPluginExecutionContext context = (IPluginExecutionContext) serviceProvider.GetService(typeof(IPluginExecutionContext)); IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); IOrganizationService service = ServiceFactory.CreateOrganizationService(context.UserId);
  • Validate if a specific attribute existing in the plugin context input parameter (C#) if (context.InputParameters.incorporates("goal") && Context.InputParameters["Target"] is Entity) //Your code goes right here
  • examine if a particular attribute latest in a entity (C#) if (entityObject.Attributes.ContainsKey("") //Your code goes here
  • Get cost of attribute from entity (C#) entityObject.GetAttributeValue(""); entityObject. GetAttributeValue ("").id.ToString(); bool myAttributeVal = entityObject.GetAttributeValue("") string myAttributeVal = entityObject.GetAttributeValue("")
  • Convert EntityCollection to DataTable (C#) public DataTable convertEntityCollectionToDataTable(EntityCollection EC) { DataTable dt = new DataTable(); int totalCount = EC.Entities.count; for (int i = 0; i 
  • assess if dataset is legitimate (C#) bool flag=false; if(Objdataset.Tables.count number>0) if(Objdataset.Tables[0].Rows.count number>0) Flag=proper;
  • Retrieve Optionset value from an AliasedValue (C#) AliasedValue aliasedval= entityObject.GetAttributeValue("").value; int optionSetVal = ((OptionSetValue) aliasedval).value; //word: for different datatypes simply use the datatype in above line of code to get the cost.
  • Code to stop Plugin from infinite loop (C#) // add this code earlier than your actual plugin common sense begins if (context.Depth >1) return;
  • Code to make use of Shared Variable in Plugins (C#) //Set the shared variable value context.SharedVariables.Add("PrimaryContact", (Object)contact.ToString()); //Get the Shared Variable cost Guid contact =new Guid((string)context.SharedVariables["PrimaryContact"]);
  • Get the Pre & put up Entity photos in Plugin (C#) Entity preEntityImage= (Entity)context.PreEntityImages["ImageName"]; Entity postEntityImage = (Entity)context.PostEntityImages["ImageName"]; //observe : The image Names are described in Plugin registration tool towards the SDK steps.
  • trace Messages the use of Tracing provider in Plugin (C#) ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService)); tracingService.trace ("");
  • Get Optionset text in Plugin (C#) if(entity.includes("")) string optionsettext = entity.FormattedValues["attributename"];
  • Retrieve entity listing facts the use of question Expression(C#) //question for the GUID of the Account using Account identify QueryExpression query = new QueryExpression("account"); string[] cols = "accountid", "identify"; query.criteria = new FilterExpression(); query.criteria.AddCondition("identify", ConditionOperator.Equal, ); query.ColumnSet = new ColumnSet(cols); EntityCollection account = crmServices.RetrieveMultiple(question); //Casting the reference to GUID Guid accountId = (Guid)account[0].Attributes["accountid"];
  • Retrieve entity list information using Fetch XML(C#) string fetchxml = @" "; EntityCollection outcomes = _serviceProxy.RetrieveMultiple(new FetchExpression(fetchxml));
  • Retrieve entity list facts the use of Guid of the listing(C#) ColumnSet cs = new ColumnSet("attribute1","attribute2"); Entity outcomes = _serviceProxy.Retrieve ("", new Guid(""), cs);
  • replace Entity listing (C#) Entity entityObj = new Entity(); entityObj.LogicalName = ""; entityObj.id = entityObj. = crmservice.replace(entityObj); //observe: whereas assigning the price use the correct datatype converison. lets say you are updating an //optionset then you have to use new OptionSetValue().
  • Delete Entity checklist (C#) crmservice.Delete("",new Guid(""));
  • Create an Entity listing the use of CRM provider (C#) Entity entityObj = new Entity(); entityObj.LogicalName = ""; entityObj. = ; entityObj. = ; crmservice.Create(entityObj);
  • Retrieve checklist the usage of paging if extra listing existing (C#) // The number of facts per page to retrieve. int queryCount = 200; // Initialize the web page quantity. int pageNumber = 1; // Initialize the variety of records. int recordCount = 0; // define the circumstance expression for retrieving facts. ConditionExpression pagecondition = new ConditionExpression(); pagecondition.AttributeName = "parentaccountid"; pagecondition.Operator = ConditionOperator.Equal; pagecondition.Values.Add(_parentAccountId); // Create the query expression and add circumstance. QueryExpression pagequery = new QueryExpression(); pagequery.EntityName = "account"; pagequery.criteria.AddCondition(pagecondition); pagequery.ColumnSet.AddColumns("identify", "emailaddress1"); // Assign the pageinfo houses to the question expression. pagequery.PageInfo = new PagingInfo(); pagequery.PageInfo.count = queryCount; pagequery.PageInfo.PageNumber = pageNumber; // The current paging cookie. When retrieving the primary web page // pagingCookie may still be null. pagequery.PageInfo.PagingCookie = null; Console.WriteLine("Retrieving account data in pages...\n"); Console.WriteLine("#\tAccount name\t\tEmail handle"); while (real) // Retrieve the page. EntityCollection effects =_service.RetrieveMultiple(pagequery); if (results.Entities != null) // Retrieve all information from the result set. foreach (Account acct in consequences.Entities) Console.WriteLine("0.\t1\t2", ++recordCount, acct.name, acct.EMailAddress1); // verify for extra information, if it returns genuine. if (results.MoreRecords) Console.WriteLine("\n****************\nPage number 0\n****************", pagequery.PageInfo.PageNumber); Console.WriteLine("#\tAccount name\t\tEmail tackle"); // Increment the page number to retrieve the next web page. pagequery.PageInfo.PageNumber++; // Set the paging cookie to the paging cookie back from current outcomes. pagequery.PageInfo.PagingCookie = consequences.PagingCookie; else // If no greater statistics are in the outcomes nodes, exit the loop. ruin;
  • Get Optionset Values and text Metadata in CRM (C#) var attributeRequest = new RetrieveAttributeRequest EntityLogicalName = "entityName", LogicalName = "attributeName", RetrieveAsIfPublished = actual ; var attributeResponse = (RetrieveAttributeResponse)provider.Execute(attributeRequest); var attributeMetadata = (EnumAttributeMetadata)attributeResponse.AttributeMetadata; var optionList = (from o in attributeMetadata.OptionSet.options select new price = o.cost, text = o.Label.UserLocalizedLabel.Label ).ToList();
  • replace the status of facts (C#) Guid leadId = new Guid("D020F344-A470-E111-B9DA-00155D04DC01"); SetStateRequest request = new SetStateRequest EntityMoniker = new EntityReference("lead", leadId), State = new OptionSetValue(2), popularity = new OptionSetValue(6) ; crmService.Execute(request); //observe: State : lively/Inactive
  • read Excel Sheet checklist to records Set (C#) //Use the under namespace first: the use of Excel = Microsoft.workplace.Interop.Excel; the use of gadget.statistics; //Code to study excel facts OleDbConnection conn = new OleDbConnection("issuer=Microsoft.Jet.OLEDB.four.0;data source='c:\\examine.xls';prolonged houses=Excel 8.0;"); OleDbDataAdapter cmd = new OleDbDataAdapter("opt for * from [Sheet1$]", conn); cmd.TableMappings.Add("desk", "TestTable"); DataSet DtSet = DataSet(); cmd.Fill(DtSet);
  • Supress duplicate Detection Rule while developing checklist (C#) // Create operation by using suppressing duplicate detection CreateRequest reqCreate = new CreateRequest(); reqCreate.goal = account; reqCreate.Parameters.Add("SuppressDuplicateDetection", authentic); // observe : trade to false to prompt the reproduction detection. CreateResponse createResponse = (CreateResponse)_service.Execute(reqCreate); Guid _dupAccountId = createResponse.identity; // Retrieve the account containing with its few attributes. ColumnSet cols = new ColumnSet( new String[] "identify", "accountnumber"); Entity retrievedAccount = _service.Retrieve("account", _dupAccountId, cols); // update the existing account with new account number. retrievedAccount.AccountNumber = "ACC006"; // update operation – replace record, if a duplicate is not discovered. UpdateRequest reqUpdate = new UpdateRequest(); reqUpdate.goal = retrievedAccount; reqUpdate["SuppressDuplicateDetection"] = false; // reproduction detection is activated. // replace the account listing. UpdateResponse updateResponse = (UpdateResponse)_service.Execute(reqUpdate);
  • Assigning Values to distinct DataType box whereas growing list (C#) DataType example Single Line of textual content account["name"] = Convert.ToString("Microsoft India"); //String choice Set account["accountcategorycode"] = new OptionSetValue(1); //Int Two alternate options account["donotbulkemail"] = false; //boolean value -authentic/false image entityObj["entityimage"] = File.ReadAllBytes("images\\144x144.png"); whole number account["numberofemployees"] = 50; //int cost Floating point number account["address1_latitude"] = Convert.ToDouble(-0.330); //double Decimal quantity account["attributename"] = Convert.ToDecimal(three.5); //deciaml foreign money account["revenue"] = new funds(50.60); //deciml cost multiple lines of textual content account["description"] = Convert.ToString("here is a fine acc"); Date and Time account["lastusedincampaign"] = new DateTime(2017,11,23); //yyyy,mm,dd search for account["address1_addressid"] = new EntityReference("tackle",new Guid("11111111-1111-1111-1111-111111111111")); //32 bit guid
  • Generate Entity Metadata the usage of C# RetrieveAllEntitiesRequest request = new RetrieveAllEntitiesRequest() EntityFilters = EntityFilters.Entity, RetrieveAsIfPublished = real ; // Retrieve the MetaData. RetrieveAllEntitiesResponse response = (RetrieveAllEntitiesResponse)_serviceProxy.Execute(request); // Create an instance of StreamWriter to write down text to a file. // The the usage of observation also closes the StreamWriter. // To view this file, right click the file and choose open with Excel. // Excel will work out the schema and display the suggestions in columns. String filename = String.Concat("EntityInfo.xml"); using (StreamWriter sw = new StreamWriter(filename)) // Create Xml creator. XmlTextWriter metadataWriter = new XmlTextWriter(sw); // delivery Xml File. metadataWriter.WriteStartDocument(); // Metadata Xml Node. metadataWriter.WriteStartElement("Metadata"); foreach (EntityMetadata currentEntity in response.EntityMetadata) //if (currentEntity.IsIntersect.value == false) if (true) // start Entity Node metadataWriter.WriteStartElement("Entity"); // Write the Entity's tips. metadataWriter.WriteElementString("EntitySchemaName", currentEntity.SchemaName); metadataWriter.WriteElementString("OTC", currentEntity.ObjectTypeCode.ToString()); metadataWriter.WriteElementString("OwnershipType", currentEntity.OwnershipType.cost.ToString()); if (currentEntity.DisplayName.UserLocalizedLabel != null) metadataWriter.WriteElementString("DisplayName", currentEntity.DisplayName.UserLocalizedLabel.Label); if (currentEntity.DisplayCollectionName.UserLocalizedLabel != null) metadataWriter.WriteElementString("DisplayCollectionName", currentEntity.DisplayCollectionName.UserLocalizedLabel.Label); metadataWriter.WriteElementString("IntroducedVersion", currentEntity.IntroducedVersion.ToString()); metadataWriter.WriteElementString("AutoRouteToOwnerQueue", currentEntity.AutoRouteToOwnerQueue.ToString()); metadataWriter.WriteElementString("CanBeInManyToMany", currentEntity.CanBeInManyToMany.cost.ToString()); metadataWriter.WriteElementString("CanBePrimaryEntityInRelationship", currentEntity.CanBePrimaryEntityInRelationship.value.ToString()); metadataWriter.WriteElementString("CanBeRelatedEntityInRelationship", currentEntity.CanBeRelatedEntityInRelationship.cost.ToString()); metadataWriter.WriteElementString("CanCreateAttributes", currentEntity.CanCreateAttributes.cost.ToString()); metadataWriter.WriteElementString("CanCreateCharts", currentEntity.CanCreateCharts.value.ToString()); metadataWriter.WriteElementString("CanCreateForms", currentEntity.CanCreateForms.price.ToString()); metadataWriter.WriteElementString("CanCreateViews", currentEntity.CanCreateViews.cost.ToString()); metadataWriter.WriteElementString("CanModifyAdditionalSettings", currentEntity.CanModifyAdditionalSettings.price.ToString()); metadataWriter.WriteElementString("CanTriggerWorkflow", currentEntity.CanTriggerWorkflow.cost.ToString()); metadataWriter.WriteElementString("IsActivity", currentEntity.IsActivity.cost.ToString()); //metadataWriter.WriteElementString("ActivityTypeMask", currentEntity.ActivityTypeMask.ToString()); metadataWriter.WriteElementString("IsActivityParty", currentEntity.IsActivityParty.value.ToString()); metadataWriter.WriteElementString("IsAuditEnabled", currentEntity.IsAuditEnabled.price.ToString()); metadataWriter.WriteElementString("IsAvailableOffline", currentEntity.IsAvailableOffline.ToString()); metadataWriter.WriteElementString("IsChildEntity", currentEntity.IsChildEntity.ToString()); metadataWriter.WriteElementString("IsConnectionsEnabled", currentEntity.IsConnectionsEnabled.ManagedPropertyLogicalName.ToString()); metadataWriter.WriteElementString("IsCustomEntity", currentEntity.IsCustomEntity.cost.ToString()); metadataWriter.WriteElementString("IsCustomizable", currentEntity.IsCustomizable.cost.ToString()); metadataWriter.WriteElementString("IsDocumentManagementEnabled", currentEntity.IsDocumentManagementEnabled.value.ToString()); metadataWriter.WriteElementString("IsDuplicateDetectionEnabled", currentEntity.IsDuplicateDetectionEnabled.value.ToString()); if (currentEntity.IsEnabledForCharts != null) metadataWriter.WriteElementString("IsEnabledForCharts", currentEntity.IsEnabledForCharts.cost.ToString()); metadataWriter.WriteElementString("IsImportable", currentEntity.IsImportable.price.ToString()); metadataWriter.WriteElementString("IsIntersect", currentEntity.IsIntersect.price.ToString()); metadataWriter.WriteElementString("IsMailMergeEnabled", currentEntity.IsMailMergeEnabled.price.ToString()); metadataWriter.WriteElementString("IsManaged", currentEntity.IsManaged.value.ToString()); metadataWriter.WriteElementString("IsMappable", currentEntity.IsMappable.cost.ToString()); metadataWriter.WriteElementString("IsReadingPaneEnabled", currentEntity.IsReadingPaneEnabled.cost.ToString()); metadataWriter.WriteElementString("IsRenameable", currentEntity.IsRenameable.cost.ToString()); metadataWriter.WriteElementString("IsValidForAdvancedFind", currentEntity.IsValidForAdvancedFind.value.ToString()); metadataWriter.WriteElementString("IsValidForQueue", currentEntity.IsValidForQueue.value.ToString()); metadataWriter.WriteElementString("IsVisibleInMobile", currentEntity.IsVisibleInMobile.cost.ToString()); metadataWriter.WriteElementString("PrimaryIdAttribute", currentEntity.PrimaryIdAttribute); metadataWriter.WriteElementString("PrimaryNameAttribute", currentEntity.PrimaryNameAttribute); metadataWriter.WriteElementString("ReportViewName", currentEntity.ReportViewName); metadataWriter.WriteElementString("RecurrenceBaseEntityLogicalName", currentEntity.RecurrenceBaseEntityLogicalName); if (currentEntity.Description.UserLocalizedLabel != null) metadataWriter.WriteElementString("Description", currentEntity.Description.UserLocalizedLabel.Label); // conclusion Entity Node metadataWriter.WriteEndElement(); // conclusion Metadata Xml Node metadataWriter.WriteEndElement(); metadataWriter.WriteEndDocument(); // shut xml author. metadataWriter.shut();
  • check if historic price and New value of box are different in Plugin photos (C#) Entity preEntityImage= (Entity)context.PreEntityImages["ImageName"]; Entity postEntityImage = (Entity)context.PostEntityImages["ImageName"]; var oldNameValue = preEntityImage.GetAttribute("name"); var newNameValue = postEntityImage.GetAttribute("identify"); if(oldNameValue.ToLower() != newNameValue.ToLower()) //Your code goes here
  • Early certain Syntax developing Contact record (C#) Contact contact = new Contact() FirstName = "Charles", LastName = "Brown", Address1_Line1 = "123 leading St." ; _contactId = _serviceProxy.Create(contact);
  • Late certain Syntax creating Contact record (C#) Entity contactent = new Entity("contact"); contactent["firstname"] = "Charles"; contactent["lastname"] = "Brown "; contactent["address1_line1"] = "123 leading St."; Guid _contactId = _serviceProxy.Create(contactent);
  • Declaring enter & Output Arguments,Default value & Set Requirement degree of the Parameter in custom Workflow activities(C#) For Boolean category(enter) [Input("Bool input")] [Default("True")] public InArgument BoolFlag get; set; For Boolean type(Output) [Output("Bool input")] public OutArgument BoolFlag get; set; For Boolean class (each enter and Output) [Input("Bool input")] [Output("Bool output")] [Default("False")] public InOutArgument BoolFlag get; set; DateTime [Input("DateTime input")] [Output("DateTime output")] [Default("2013-07-09T02:54:00Z")] public InOutArgument DateTime get; set; Decimal [Input("Decimal input")] [Output("Decimal output")] [Default("20.75")] public InOutArgument Decimal get; set; Double [Input("Double input")] [Output("Double output")] [Default("200.2")] public InOutArgument Double get; set; Integer [Input("Int input")] [Output("Int output")] [Default("2322")] public InOutArgument Int get; set; funds (foreign money) [Input("Money input")] [Output("Money output")] [Default("232.3")] public InOutArgument cash get; set; OptionSetValue [Input("OptionSetValue input")] [Output("OptionSetValue output")] [AttributeTarget("account", "industrycode")] [Default("3")] public InOutArgument OptionSetValue get; set; String [Input("String input")] [Output("String output")] [Default("string default")] public InOutArgument String get; set; Entity Reference [Input("EntityReference input")] [Output("EntityReference output")] [ReferenceTarget("account")] [Default("3B036E3E-94F9-DE11-B508-00155DBA2902", "account")] public InOutArgument AccountReference get; set; . Required Argument Attribute [RequiredArgument] [Input("Update next Anniversary date for")] [ReferenceTarget("contact")] public InArgument Contact get; set; Output Parameters //here's the identify of the parameter that may be lower back returned to the workflow [Output("Credit Score")] //this line identifies the selected attribute which will be passed returned to the workflow [AttributeTarget(CustomEntity, "new_creditscore")] // declares the output parameter and proclaims the relevant statistics classification of the parameter being passed lower back. public OutArgument CreditScore get;set;
  • Get cost from enter Argument in custom Workflow actions (C#) If enter argument is asserted as beneath then we can get the value as defined below. [Input("Date Of Birth")] public InArgument DOB get; set; blanketed override void Execute(CodeActivityContext context) DateTime dtDOB = DOB.Get(context);
  • Set value from Out Argument in customized Workflow actions (C#) If Output argument is declared as under then we are able to get the price as defined under. [Output("FinalAge")] public OutArgument Age get; set; covered override void Execute(CodeActivityContext context) int CalculatedAge=30; Age.Set(context, CalculatedAge);
  • A sample custom Workflow Code (C#) the use of device.Collections.regularly occurring; using gadget.Linq; using gadget.actions; using Microsoft.Xrm.Sdk.Workflow; namespace GetAge public sealed type CalculateAge:CodeActivity [Input("Date Of Birth")] public InArgument DOB get; set; protected override void Execute(CodeActivityContext context) DateTime dtDOB = DOB.Get(context); int CalculatedAge = Convert.ToInt32((DateTime.Now.Subtract(dtDOB).TotalDays)/365); Age.Set(context, CalculatedAge); [Output("FinalAge")] public OutArgument Age get; set; 
  • A pattern Plugin Code (C#) using equipment; the usage of system.ServiceModel; using Microsoft.Xrm.Sdk; namespace Microsoft.Crm.Sdk.Samples public category FollowupPlugin: IPlugin /// /// A plug-in that creates a comply with-up assignment undertaking when a brand new account is created. /// /// Register this plug-in on the Create message, account entity, /// and asynchronous mode. /// public void Execute(IServiceProvider serviceProvider) //Extract the tracing carrier for use in debugging sandboxed plug-ins. ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService)); // gain the execution context from the carrier company. IPluginExecutionContext context = (IPluginExecutionContext) serviceProvider.GetService(typeof(IPluginExecutionContext)); // The InputParameters collection incorporates all the records passed in the message request. if (context.InputParameters.contains("goal") && context.InputParameters["Target"] is Entity) // acquire the goal entity from the input parameters. Entity entity = (Entity)context.InputParameters["Target"]; // check that the goal entity represents an account. // If no longer, this plug-in changed into no longer registered accurately. if (entity.LogicalName != "account") return; are trying // Create a job activity to observe up with the account consumer in 7 days. Entity followup = new Entity("task"); followup["subject"] = "send e mail to the brand new customer."; followup["description"] = "observe up with the client. determine if there are any new concerns that want decision."; followup["scheduledstart"] = DateTime.Now.AddDays(7); followup["scheduledend"] = DateTime.Now.AddDays(7); followup["category"] = context.PrimaryEntityName; // consult with the account in the project exercise. if (context.OutputParameters.carries("identification")) Guid regardingobjectid = new Guid(context.OutputParameters["id"].ToString()); string regardingobjectidType = "account"; followup["regardingobjectid"] = new EntityReference(regardingobjectidType, regardingobjectid); // acquire the organization carrier reference. IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); IOrganizationService carrier = serviceFactory.CreateOrganizationService(context.UserId); // Create the project in Microsoft Dynamics CRM. tracingService.trace("FollowupPlugin: growing the task endeavor."); provider.Create(followup); trap (FaultException ex) throw new InvalidPluginExecutionException("An error took place in the FollowupPlugin plug-in.", ex); seize (Exception ex) tracingService.hint("FollowupPlugin: 0", ex.ToString()); throw;
  • Write Log Messages into a textual content File Public void WriteLog(string msg) String datestamp = DateTime.Now.Date.ToString("d"); string course = string.structure(@"E:\AppServ\0_log.txt", datestamp); // outline the path to shop the file if (!File.Exists(path)) File.Create(route); TextWriter tw = new StreamWriter(route); tw.WriteLine(msg); tw.shut();
  • Code for Exception handling (C#) are attempting //Your code catch (FaultException ex) Console.WriteLine("The software terminated with an error."); Console.WriteLine("Timestamp: 0", ex.aspect.Timestamp); Console.WriteLine("Code: 0", ex.detail.ErrorCode); Console.WriteLine("Message: 0", ex.detail.Message); Console.WriteLine("internal Fault: 0", null == ex.aspect.InnerFault ? "No internal Fault": "Has internal Fault"); trap (equipment.TimeoutException ex) Console.WriteLine("The utility terminated with an error."); Console.WriteLine("Message: 0", ex.Message); Console.WriteLine("Stack trace: 0", ex.StackTrace); Console.WriteLine("inner Fault: 0", null == ex.InnerException.Message ? "No inner Fault": ex.InnerException.Message); trap (system.Exception ex) Console.WriteLine("The application terminated with an error."); Console.WriteLine(ex.Message); // reveal the details of the internal exception. if (ex.InnerException != null) Console.WriteLine(ex.InnerException.Message); FaultException fe = ex.InnerException as FaultException; if (fe != null) Console.WriteLine("Timestamp: 0", fe.element.Timestamp); Console.WriteLine("Code: 0", fe.detail.ErrorCode); Console.WriteLine("Message: 0", fe.detail.Message); Console.WriteLine("hint: 0", fe.detail.TraceText); Console.WriteLine("internal Fault: 0", null == fe.aspect.InnerFault ? "No internal Fault": "Has inner Fault");
  • Create Outlook offline Filters (C#) String contactName = String.layout("offlineFilteredContact 0", DateTime.Now.ToLongTimeString()); String fetchXml = String.layout(""+ ""+ "", contactName); SavedQuery filter = new SavedQuery(); filter.FetchXml = fetchXml; filter.IsQuickFindQuery = false; filter.QueryType = SavedQueryQueryType.OfflineFilters; filter.ReturnedTypeCode = Contact.EntityLogicalName; filter.name = "ReadOnlyFilter_"+ contactName; filter.Description = "sample offline filter for Contact entity"; _offlineFilter = _serviceProxy.Create(filter);
  • Encryption and Decryption the usage of C# the use of device; the use of device.protection.Cryptography; the usage of system.textual content; namespace SecurityModule public category EncryptionManager public static string Encrypt(string input, string key) byte[] inputArray = UTF8Encoding.UTF8.GetBytes(input); TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider(); tripleDES.Key = UTF8Encoding.UTF8.GetBytes(key); tripleDES.Mode = CipherMode.ECB; tripleDES.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = tripleDES.CreateEncryptor(); byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.size); tripleDES.Clear(); return Convert.ToBase64String(resultArray, 0, resultArray.size); public static string Decrypt(string input, string key) byte[] inputArray = Convert.FromBase64String(enter); TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider(); tripleDES.Key = UTF8Encoding.UTF8.GetBytes(key); tripleDES.Mode = CipherMode.ECB; tripleDES.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = tripleDES.CreateDecryptor(); byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.size); tripleDES.Clear(); return UTF8Encoding.UTF8.GetString(resultArray);
  • examine All text to string and skim all Line to array kind a textual content File (C#) string course = @"c:\temp\MyTest.txt"; // Open the file to study from. string readText = File.ReadAllText(path); string[] readText = File.ReadAllLines(route);
  • break up textual content the use of separator in C# string source = "ONE|TWO|THREE"; string[] stringSeparators = new string[] "; string[] outcomes= supply.break up(stringSeparators, StringSplitOptions.None);
  • access container by way of name on kind (Formscript/Javascript) var myAttribute = Xrm.web page.getAttribute("identify");
  • access box by using Index on form (Formscript/Javascript) var myAttribute = Xrm.page.getAttribute(0);
  • Get all Attributes on form (Formscript/Javascript) var allAttributes = Xrm.page.getAttribute();
  • Get All optionset Attributes of the kind var optionsetAttributes = Xrm.web page.getAttribute( feature (attribute, index) return attribute.getAttributeType() == "optionset"; );
  • Alert All attributes with Required Validation of the kind (Javascript) feature AlertRequiredAttributes () Xrm.web page.statistics.entity.attributes.forEach( characteristic (attribute, index) if (attribute.getRequiredLevel() == "required") alert(attribute.getName()); );
  • Get the price of a box/attribute on kind (Javascript) var fieldvalue= Xrm.web page.getAttribute("identify").getValue();
  • Set the cost of a box/attribute on kind (Javascript) Xrm.page.getAttribute("name").setValue("new value");
  • Get the textual content price of the currently chosen alternative of an optionset attribute (Javascript) var addressType = Xrm.web page.getAttribute("address1_addresstypecode").getText();
  • Get the at the moment chosen alternative object in an optionset attribute (Javascript) var addressTypeOption = Xrm.web page.getAttribute("address1_addresstypecode").getSelectedOption();
  • Get the category of attribute (Javascript) var attributeType = Xrm.web page.getAttribute("address1_addresstypecode").getAttributeType();
  • Get how the attribute is formatted (Javascript) var attributeFormat = Xrm.page.getAttribute(0).getFormat();
  • Get the initial value of a Booleanor Optionset attribute (Javascript) var attributeInitialValue = Xrm.page.getAttribute("address1_addresstypecode").getInitialValue();
  • assess even if an attribute cost has modified (Javascript) var isNameChanged = Xrm.page.getAttribute("identify").getIsDirty();
  • Get maximum cost of a container (Javascript) Var limitMaxvalue = Xrm.web page.getAttribute("creditlimit").getMax();
  • Get the optimum allowed size for an attribute that includes a string (Javascript) var maxNameLen= Xrm.page.getAttribute("name").getMaxLength();
  • Get minimal value of a container (Javascript) Var limitMinvalue = Xrm.web page.getAttribute("creditlimit").getMin();
  • Get the logical name of an attribute (Javascript) var attributeName = Xrm.page.getAttribute("creditlimit").getName();
  • Get the alternative set textual content by using value of attribute (Javascript) var addressTypeOption = Xrm.web page.getAttribute("address1_addresstypecode").getOption(1); alert(addressTypeOption.text); //shows 'invoice To'
  • Get the requirement degree of an attribute (Javascript) var creditLimitRequired = Xrm.web page.getAttribute("creditlimit").getRequiredLevel();
  • Set the requirement degree of an attribute as Required (Javascript) Xrm.page.getAttribute("creditlimit").setRequiredLevel("required"); //required/none/ informed
  • assess if the facts in an attribute might be submitted when the facts is saved (Javascript) var nameSubmitMode = Xrm.web page.getAttribute("identify").getSubmitMode(); // always/under no circumstances/ soiled
  • control whether statistics in an attribute should be saved when the list is saved Xrm.page.getAttribute("identify").setSubmitMode("always");
  • stay away from a record from being saved. feature My_PreventSaveFunction(eContext) eContext.getEventArgs().preventDefault(); //word: Use the eContext parameter to seize the execution context and use the preventDefault system protected with the experience arguments.
  • examine what action initiated the save.event (Javascript) characteristic GetSaveModeTextFunction(eContext) var saveModeCode = eContext.getEventArgs().getSaveMode(); var saveModeText = "Unknown"; change (saveModeCode) case 1: saveModeText = "retailer"; damage; case 2: saveModeText = "SaveAndClose"; ruin; case 5: saveModeText = "Deactivate"; smash; case 6: saveModeText = "Reactivate"; break; case 7: saveModeText = "send"; destroy; case 15: saveModeText = "Disqualify"; spoil; case sixteen: saveModeText = "Qualify"; wreck; case 47: saveModeText = "Assign"; damage; case fifty eight: saveModeText = "SaveAsCompleted"; destroy; case 59: saveModeText = "SaveAndNew"; damage; case 70: saveModeText = "AutoSave"; break; return saveModeText; //note :flow the execution context from adventure handler screen
  • screen a notification message close the box manage to point out that records is not valid. (Javascript) Xrm.page.getAttribute("name").controls.forEach( feature (handle, i) manage.setNotification("'input cost' isn't legitimate."); )
  • eradicate a notification message already displayed for a manage. Xrm.page.getAttribute("identify").controls.forEach( feature (manage, i) control.clearNotification(); )
  • screen form degree notifications message (javascript) Xrm.web page.ui.setFormNotification( "good day", "information", "myMsg" ); // myMsg is a uniquid used whereas showing the message.
  • remove kind stage notifications message (Javascript) Xrm.web page.ui.clearFormNotification("myMsg");
  • monitor a non-blocking alert dialog with a callback feature var alertDisplayedFlag = false; Xrm.Utility.alertDialog( "displaying Alert Window", function () alertDisplayedFlag = true; ) //word: display an alert and set the price of the alertDisplayedFlag variable when it's closed.
  • reveal a non-blocking confirm dialog with different callbacks counting on the button clicked by using the person. var agree = false; Xrm.Utility.confirmDialog( "Do you compromise?", feature () agree = real;, function () agree = false; );
  • access all the controls for a particular attribute var nameControls = Xrm.page.getAttribute("identify").controls.get();
  • access a control by means of name var nameControl = Xrm.page.getControl("name");
  • entry a control through index var firstControl = Xrm.web page.getControl(0);
  • entry all controls var allControls = Xrm.web page.getControl();
  • Get all optionset controls var optionsetControls = Xrm.web page.getControl(function (handle, index) return handle.getControlType() == "optionset"; )
  • Get all controls of a specific component to a Tab var generalTabAccountInfoSectionControls = Xrm.web page.ui.tabs.get("normal").sections.get("tackle").controls.get();
  • Disable all controls for an attribute Xrm.page.getAttribute("identify").controls.forEach(feature (handle, index) handle.setDisabled(proper); );
  • entry a field from header part with attribute identify is customername var nameControlInHeader = Xrm.web page.getControl("header_customername");
  • access a box control from business process circulate var nameControlInBPF = Xrm.web page.getControl("header_process_name");
  • verify if a manage is visible var isNameVisible = Xrm.page.getControl("identify").getVisible();
  • hide or demonstrate a handle of a box Xrm.page.getControl("identify").setVisible(false);
  • Get a reference to the attribute for the manage var nameAttribute = Xrm.web page.getControl("identify").getAttribute();
  • Get all optionset controls var optionSetControls = Xrm.page.getControl(feature (handle, index) return handle.getControlType() == "optionset"; );
  • Return all disabled controls var disabledControls = Xrm.web page.getControl(characteristic(handle, index) return control.getDisabled(); );
  • Disable or allow each and every handle Xrm.page.getAttribute("identify").controls.forEach(function (manage, index) manage.setDisabled(true); );
  • Get the label for a handle var nameControlLabel = Xrm.web page.getControl("identify").getLabel();
  • trade the label for a manage Xrm.web page.getControl("identify").setLabel("company name");
  • Get the identify of a control var firstControlName = Xrm.web page.getControl(0).getName();
  • Get the dad or mum of a handle var parentSection = Xrm.web page.getControl("name").getParent();
  • Set focus on a handle Xrm.web page.getControl("name").setFocus();
  • Add an choice to an optionset manage var addressTypeCodeControl = Xrm.page.getControl("address1_addresstypecode"); var billToAddressOption = addressTypeCodeControl.getAttribute().getOption(1); addressTypeCodeControl.clearOptions(); addressTypeCodeControl.addOption(billToAddressOption);
  • eradicate all of the alternate options from an optionset control Xrm.web page.getControl("address1_addresstypecode").clearOptions();
  • remove a single alternative from an optionset manage. Xrm.page.getControl("address1_addresstypecode").removeOption(1);
  • Get the URL for the content material at present displayed in an IFRAME. var iframeSource = Xrm.web page.getControl("IFRAME_targetPage").getSrc();
  • Set the URL for the content material to be displayed in an IFRAME. Xrm.page.getControl("IFRAME_targetPage").setSrc("http://www.bing.com");
  • Add a customized view for a lookup. var viewId = "C7034F4F-6F92-4DD7-BD9D-9B9C1E996380"; var viewDisplayName = "SDK pattern View"; var fetchXml = ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""; var layoutXml = ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""; Xrm.page.getControl("parentaccountid").addCustomView(viewId, "account", viewDisplayName, fetchXml, layoutXml, true);
  • Get and Set the default view for a search for. var defaultViewId = Xrm.web page.getControl("parentaccountid").getDefaultView(); var viewId = "C7034F4F-6F92-4DD7-BD9D-9B9C1E996380"; Xrm.page.getControl("parentaccountid").setDefaultView(viewId);
  • Filter the facts back for a look up control var Sdk = window.Sdk || ; Sdk.filterCustomerAccounts = characteristic () //only show bills with the classification 'favorite customer' var customerAccountFilter = ""; Xrm.web page.getControl("parentaccountid").addCustomFilter(customerAccountFilter, "account"); //set 'Sdk.setParentAccountIdFilter' within the chance form Onload adventure handler Sdk.setParentAccountIdFilter = characteristic () Xrm.page.getControl("parentaccountid").addPreSearch(Sdk.filterCustomerAccounts);
  • Refresh the records displayed in the subgrid Xrm.page.getControl("accountcontactsgrid").refresh();
  • Specify even if a date handle may still reveal the time component of the date. Xrm.web page.getControl("createdon").setShowTime(false);
  • kind Navigation Scripts, Tabs and Sections Script and other critical scripts assignment system illustration Get the identify of a navigation merchandise getId var navItemIds = [];Xrm.page.ui.navigation.items.forEach(characteristic (merchandise, index) navItemIds.push(item.getId()) );Create a navItemIds array that carries the identification values of every navigation merchandise in the Xrm.web page.ui.navigation.gadgets assortment. Get the label of a navigation merchandise. getLabel var navAddressesLabel = Xrm.page.ui.navigation.objects.get(“navAddresses”).getLabel();Assign the label for the greater Addresses navigation item to the navAddressesLabel variable. Set the label of a navigation item setLabel Xrm.page.ui.navigation.objects.get(“navAddresses”).setLabel(“other Addresses”);exchange the extra Addresses navigation item label to different Addresses. display or disguise a navigation merchandise setVisible Xrm.web page.ui.navigation.objects.get(“navAddresses”).setVisible(false);disguise the greater Addresses navigation merchandise. verify if a navigation item is visible getVisible var moreAddressesVisible = Xrm.web page.ui.navigation.gadgets.get(“navAddresses”).getVisible()Assign a Boolean cost to the moreAddressesVisible variable to symbolize even if the extra Addresses navigation item is visible. Set focus on a navigation merchandise. setFocus Xrm.web page.ui.navigation.objects.get(“navAddresses”).setFocus();Set focus on the greater Addresses navigation merchandise. determine if a tab is multiplied or collapsed getDisplayState var isGeneralTabExpanded = (Xrm.web page.ui.tabs.get(“widespread”).getDisplayState() == “elevated”)Assign a Boolean cost to the isGeneralTabExpanded variable that suggests even if the popular tab is expanded. expand or cave in a tab setDisplayState Xrm.web page.ui.tabs.get(“familiar”).setDisplayState(“collapsed”);give way the popular tab. assess if a tab is visible getVisible var isGeneralTabVisible = Xrm.page.ui.tabs.get(“conventional”).getVisible();Assign a Boolean cost to the isGeneralTabVisible variable indicating no matter if the Generaltab is seen. show or disguise a tab setVisible Xrm.web page.ui.tabs.get(“ordinary”).setVisible(false);conceal the commonplace tab. Get the label for a tab getLabel var generalTabLabel = Xrm.web page.ui.tabs.get(“ordinary”).getLabel();Assign the general tab label to the generalTabLabel variable. trade the label for a tab setLabel Xrm.page.ui.tabs.get(“established”).setLabel(“essential”);alternate the regular tab label to foremost. Set center of attention on a tab setFocus Xrm.web page.ui.tabs.get(“familiar”).setFocus();Set focus on the generic tab. Get the name of the tab getName var firstTabName = Xrm.page.ui.tabs.get(0).getName();Assign the name of the primary tab to the firstTabName variable. Get the mother or father tab of a bit getParent Xrm.web page.getControl(“industrycode”).getParent().getParent().setFocus();Set focus on the tab that incorporates the trade field. check if a bit is seen getVisible var industrySectionVisible = Xrm.web page.getControl(“industrycode”).getParent().getVisible();Assign a Boolean price to the industrySectionVisible variable indicating no matter if the part containing the business container is seen. display or disguise a piece setVisible Xrm.page.getControl(“industrycode”).getParent().setVisible(false);hide the section that includes the trade container. Get the label for a piece getLabel var industryFieldSectionLabel = Xrm.page.getControl(“industrycode”).getParent().getLabel();Assign the label of the section containing the industry container to the industryFieldSectionLabel variable. change the label for a bit setLabel Xrm.web page.getControl(“industrycode”).getParent().setLabel(“certain assistance”);alternate the label of the section that includes the industry field to designated counsel. Add a feature to the OnSaveevent addOnSave Xrm.web page.statistics.entity.addOnSave(myFunction);Add the myFunction function to the OnSave event. get rid of a function from the OnSaveevent removeOnSave Xrm.web page.records.entity.removeOnSave(myFunction);eradicate the myFunction characteristic to the OnSave experience. Add a feature to the OnChangeevent of an attribute. addOnChange Xrm.page.getAttribute(“name”).addOnChange(myFunction);Add the myFunction feature to the OnChange event of the Account identify field. eradicate a feature from the OnChangeevent of an attribute removeOnChange Xrm.page.getAttribute(“identify”).removeOnChange(myFunction);remove the myFunction characteristic to the OnChange experience of the Account identify container. Add a characteristic to the PreSearchevent of a search for manage addPreSearch here code sample is for the chance form Account (parentaccountid) lookup. When the Sdk.setParentAccountIdFilter feature is determined within the kind Onloadevent handler, the Sdk.filterCustomAccounts function is delivered to the PreSearch experience for that search for. The outcome is that handiest bills with the class(accountcategorycode) cost of favourite client (1) could be lower back.JavaScriptvar Sdk = window.Sdk || ;Sdk.filterCustomerAccounts = characteristic () //only demonstrate debts with the class ‘preferred customer’var customerAccountFilter = ““;Xrm.page.getControl(“parentaccountid”).addCustomFilter(customerAccountFilter, “account”);//set ‘Sdk.setParentAccountIdFilter’ in the probability kind Onload event handlerSdk.setParentAccountIdFilter = feature () Xrm.page.getControl(“parentaccountid”).addPreSearch(Sdk.filterCustomerAccounts); Get the URL to connect to the organization. getClientUrl var serverUrl = Xrm.web page.context.getClientUrl();Assign a string that represents the URL to the serverUrlvariable. Get the entertaining identifier for the existing person. getUserId var userId = Xrm.web page.context.getUserId();Assign a string that represents the person’s identification to the userId variable. Get the identify of the current person. getUserName var userName = Xrm.web page.context.getUserName();Assign a string that represents the person’s name to the userName variable.This system is only available for up-to-date entities. Get the language code that represents the person’s preferred person interface language. getUserLcid var userLCID = Xrm.page.context.getUserLcid();Assign a host that shows the consumer’s favorite language to the userLCID variable. Get an array of strings that represents the GUID values for each safety function assigned to the current consumer and any teams that the person is linked to. getUserRoles var userRoles = Xrm.page.context.getUserRoles();Assign an array of strings that represents the consumer’s security roles to the userRoles variable. verify whether the script is operating in the Microsoft Dynamics 365 for Outlook customer. customer.getClient var isOutlookClient = (Xrm.page.context.customer.getClient() == “Outlook”);Assign a Boolean cost that represents no matter if your code is running within the Dynamics 365 for Outlook customer to the isOutlookClient variable. investigate even if the user is working offine with the Microsoft Dynamics 365 for Microsoft office Outlook with Offline access client. customer.getClientState var IsOffline = (Xrm.web page.context.customer.getClientState() == “Offline”);Assign a Boolean cost that represents whether the consumer is currently working offline to the IsOfflinevariable. Get the logical identify of the present entity getEntityName var entityName = Xrm.page.statistics.entity.getEntityName();Assign the logical entity name to the entityName variable. Get the price of the fundamental attribute for the current entity.The primary attribute is the value used to identify the listing. as an example contact.fullname. getPrimaryAttributeValue var primaryAttributeValue = Xrm.web page.information.entity.getPrimaryAttributeValue();Assign the price of the basic attribute to the primaryAttributeValue variable.This method is barely attainable for up to date entities. Get the id of the latest list getId var recordId = Xrm.web page.statistics.entity.getId();Assign the id of the checklist to the recordId variable. Asynchronously refresh the facts of the form without reloading the web page. refresh Xrm.page.information.refresh();Refreshes the records in the kind.This components is simply obtainable for up to date entities. save the latest record Xrm.page.information.entity.retailer Xrm.page.records.entity.save();Saves the checklist. There are optional arguments. Use saveandcloseor saveandnew to function the equal movements. keep the existing listing asynchronously with the choice to setcallback services to be executed after the save operation is completed. Xrm.web page.records.store Xrm.web page.facts.store().then(function()Xrm.Utility.alertDialog(“record saved”);,characteristic(error)Xrm.Utility.alertDialog(error.message););Saves the list and shows a message displaying the repute of the shop.This formulation is barely accessible for updated entities. determine no matter if any statistics in the current listing is modified. getIsDirty var isDirty = Xrm.page.information.entity.getIsDirty();Assign a Boolean value that represents no matter if records within the list has modified to the isDirty variable. Get a string that represents the facts that will be sent to the server when the list is saved. getDataXml var dataXml = Xrm.page.information.entity.getDataXml();Assign a string that represents the records to be saved to the dataXmlvariable.
  • Thanks for analyzing the post.

    Tuesday, November 7, 2017

    What are the Best (free) CRM tools that integrate with Google Apps?

    1.Salesflare

    Salesflare has been built for seamless integration with Gmail and all Google Apps, along with other email platforms and apps. In fact, aside from the web and mobile app, you can easily access Salesflare from inside your Gmail inbox, as it sits right next to your emails.
    It’s not free, I’ll have to disappoint you on that. Though I understand that you look to spend the least possible on your tools, free CRMs have little more functionality than Google Sheets and/or Contacts, which are actual Google Apps. They’ll charge you for any real CRM-like feature. So be careful around ‘free’ CRMs.
    You do get value for money: Salesflare will integrate with email, calendar, phone, social, web, company databases etc. and combine all that data to generate automated customer info and timelines. The idea is for you to never have to manually input data again so you can fully focus on your customers.
    The whole CRM is built for efficiency, compatibility and convenience.
    This web-view of the app gives an idea of what the automated timeline looks like:




    Pipeline-view allows you to efficiently keep track of all your leads:


    On top of Gmail and Google Apps, you can connect Salesflare to 750+ other apps with Zapier. Or you can easily build on the API yourself.


    2. ProsperWorks

    I'd say it's the best CRM if you are looking for something that closely integrates with Google Apps. 

    Here are some of the feature benefits: 
    • SIMPLICITY & EASE.
      Literally takes less than 10 minutes to set up. As easy to use as Gmail!
    • AUTOMATION
      ProsperWorks automates most of the manual data entry - a huge time saver and productivity improvement!
    • GOOGLE INTEGRATION
      Integration with Gmail, Google Calendar, and Drive. You update, ProsperWorks syncs!
    • AND MORE..
       - Reports: Sales pipeline management made easy with its intuitive reporting feature.
       - Auto reminders: set reminders so you never miss a thing!
       - Mobility: iOS and Android mobile apps.
       - Integration: Zapier integration allows you to connect with 300+ apps like Evernote, Dropbox, MailChimp, etc.
       - Work from your inbox: Gmail plugin allows you to work right from your inbox.

      AND MUCH MORE..

    3. Google Contacts

    Depending on what you need from a CRM, Google Contacts itself might be enough of a CRM for you. It has fields to track anything you want about a contact, a notes section to save extra data about your communications and more, and a button to let you pull up all of your conversations with that contact. Here's more info about using Google Contacts as a free CRM: Google Contacts as a Free CRM


    4. Freshsales CRM

    Would recommend you to try Freshsales CRM that integrates with G Suite (previously Google Apps).
    • AI-based lead scoring, built-in phone, email, activity capture, intelligent workflows and more.
    • Free for upto 10 users. Paid plans start from 12 USD.
    Highlights
    --------------
     - Built-in phone system to make and receive calls, and buy phone numbers of various countries
     - Behavior-based Lead Scoring to prioritize and segment leads based on email, website and in-app engagement
     - Visual deal pipeline to track deals across stages
     - 360 degree view of contacts and accounts
    - Real-time email alerts on opens and link clicks
     - Track customer journey on website and in-app
     - Intelligent Workflows to help get more done
     - 2-way Gmail sync
     - Integrate email to send and receive emails in Freshsales
     - Send bulk emails, schedule and create personalized email templates. Get insightful metrics on what templates works and what does not.
     - Native Freshdesk, Segment and Google Calendar Integration
     - Easily connect with Freshsales with Google Apps Single-Sign On (SSO)

    5. NetHunt
    I suggest you trying out NetHunt CRM for Gmail and maybe you’ll end up deciding that it’s the best :)
    It’s based around Gmail and Google Apps, has a very simple and effective UI and can be used by virtually any kind of business, from marketing and sales, to retail, customer support or real estate.

    NetHunt CRM is also one of the most affordable systems currently on the market - basically it’s $5 user/month with all of the features included (no limitations)! And that includes:

    1. CRM inside Gmail. Send an email and NetHunt will immediately turn it into a record. Receive an email from a customer - immediately see his or her data inside the message.
    2. Sales pipeline in Gmail. Records are card for storing customer data. You can group them by any field and manage records kanban-style, moving client through the sales stages.
    3. Email marketing. Segment you leads in CRM and send them personalized mass mail.
    4. Open tracking. See who where and when has opened the email you’ve sent.
    5. Follow-ups. Flag a message or a record for later to contact leads or customers when the time is right.
    6. Google Apps integration. Sync leads with Google Contact, Follow-ups with Calendar, add files from Google Drive.
    7. $25 for 5 user. All features included, with no limitations to the number of records, custom field, etc.

    6. ClinchPad

    ClinchPad integrates with

    1. Gmail/Google Mail for business
    2. Google Calendar
    3. Google Contacts
    4. GDrive


    Full list of features are here - https://www.clinchpad.com/features and ClinchPad is FREE for your first 100 leads

    7. HubspotCRM


    HubSpot CRM: This humble sales-focused CRM is so simple to use, you’ll be navigating it like a pro within an hour. It’s ease of use and the price tag (free!), make it an ideal starter CRM. HubSpot CRM logs emails with your contacts, and helps your sales team to keep track of opportunities. It also automatically captures leads, saving your sales team hours of data entry work.
    Pricing: totally FREE!
    8. Bitrix24
    Bitrix24 - free CRM for 12 users, works with Gmail, Google Drive and Google calendar.
    • Gmail - you can integrate your mail account with Bitrix24 CRM in 2 ways: first you will be able to send emails to clients from Bitrix24 with your gmail address set as sender’s address; second - you will be able to get new emails recorded in your CRM as new leads or, if the sender’s address is already in your CRM base - this email will be attached to it.
    • Google Drive - sales agents can add comments to a lead (contact, company) in Bitrix24 & attach files, including an option to attach files form connected Google Drive directly. Besides that Bitrix24 offers My Drive & Company Drive modules for document management - both can be integrated with Google Drive as well.
    • Google Calendar - a 2-way synchronization is available between Google Calendar & Bitrix24 Calendar.

    9. Solve CRM


    Solve360 (also called Solve CRM) is a Google Cloud Premier Partner that offers 2-way sync with Google contacts and Calendar. Users are able to pull CRM data directly into Google sheets reports and Docs. Collaborative features include intelligently shared client email history. Activity Workflows can be implemented on command or after time intervals. Solve360 also allows data backup and storage and full data export.

    Besides its G-Suite integration, Solve360 integrates with Xero, Zendesk, Freshbooks, MailChimp, RingCentral, Wufoo, Zapier and others. It also offers a mobile app and its developer API. Solve360 is available for a single rate of $25 per user/month with a minimum of 4 users.
    Any other cool tools I should consider?




    Sunday, October 22, 2017

    What a world of AI robot writers will look like?

    Just as video killed the radio celebrity, so too will AI demolish writers, journalists, and editors. Legions of wordsmiths — from Fiverr freelancers to The NY times journalists — may additionally soon discover themselves out of work. Besides the fact that children, they should be defeated now not through opponents overseas, but via algorithms.

    To take into account the way forward for writing and the way AI writers might look like, we first deserve to seem at the types of jobs which are already on the slicing block.

    Writing jobs are not comfortably automatic…appropriate?
    Automation does not touch all jobs equally, and it can be entirely merely considered in the US. A stroll in the course of the put up-industrial heartland of Ohio yields a very different graphic than a city like San Francisco, with its excessive attention of highbrow capital.

    As tempting, because it can be responsible overseas competitors, it appears that the high-quality job-killer is not outsourcing, however quite automation. In any case, American manufacturing is doing reasonably smartly: manufacturing grew by very nearly 2.2 percent per year — a long way sooner than the ordinary US economic system, which increased by 1.6 percent in 2016.

    It looks manufacturing is booming, besides the fact that flesh-and-blood people are not. However, why are factory jobs so vulnerable to robots? Why now not programmers in San Francisco or an author in Manhattan metropolis?

    It comes down to projects. Corporations as diverse as Oxford, McKinsey, and PwC, have concluded that jobs which are mostly wholly automated share a couple of essential traits. They ought to have repetitive routines and high predictability (consider meeting traces or stocking bins at big warehouses). Such roles are simple, with little need for adaptation or lateral thinking.

    Conversely, jobs with an excessive degree of unpredictability and a need for advanced problem-fixing are far less likely to be surrendered to the machines. One handy little tool from NPR, which predicts your occupation’s probabilities of being automated, offers writers and authors a 3.8 p.C chance of being edged out via computer courses. As the general wisdom goes, creativity is not quite merely replicated with the aid of machines.

    Alternatively, is it?

    The Turing point

    For an AI author to be helpful, its work has to circulate the Turing look at various, in which a pc must trick humans into considering that it too, is human.

    This is undoubtedly critical for artistic algorithms. Clients do not need to devour content material created through a bot, as we accept as real with that robots cannot with no trouble connect with us on an emotional degree. What we agree with there is not any components for creativity: one cannot without difficulty cut back a piece like conflict and Peace to algorithms and binary inputs.

    However, the truth is that programmers can conjure creativity — and they have already done it. Lower back in 2011, an undergrad at Duke institution modified an algorithm to dissect poems into smaller accessories (stanzas, lines, phrases) and then generate its lyrics automatically. One was even authorized through Duke’s literary journal, The Archive. The AI creator thereby with ease handed the Turing examine by using passing off its advent as a work using a human.

    Of route, there’s a global of difference between a poem of 9 strains and a long-form article within the prominent apple instances (or some plenty more revered outlet, like TNW). Despite the fact, it is essential to understand that this marks a crucial milestone; for years, Americans have speculated that creativity changed into past the attain of machines. Now that AIs have written poems, songs, and even short films — the writing is on the wall.

    What would a robot creator appear to be?
    In all probability, one cause that AI writers are desperate to think about is that the vast majority of them cannot operate to the same degree as human writers, yet. As an example, FB shut down its language-building AIs as a result of they could not use natural language with no trouble.

    However, to ignore AI on account of just a few public mishaps is unhealthy, as the pieces of the puzzle are already in the area. Now not only have AI writers already handed the Turing examine. However, they could additionally rely on specialized algorithms like in-depth gaining knowledge of (which recently enabled an AI to defeat a human within the notoriously summary online game of Go) to hone their writing skills. Additionally, AIs can already read manner reams of facts seamlessly, devoid of the meals and rest required through meat-primarily based counterparts.

    for instance, despite initial setbacks, IBM’s Watson can analyze heaps of experiences and generate insights, even assisting doctors first tune diagnoses — and save lives within the procedure.

    From here, it is a small step to robot writers. In promoting, AI copywriters are versatile: they could draft a whole lot of distinct ad campaigns, test and analyze the strengths of every different iteration, and utilizing deep getting to know, develop into more popular writers rapidly. Most of all, AI will not have to relaxation, get paid, or incur fees like award shows.

    averting obsolescence
    To steer clear of going the way of the horse, it is clear that we need a whole new paradigm of AI-human cooperation, not competitors.
    There's already one location at the Washington post; the place executives became to AI author Heliograf to develop their net audience. Editors enter keywords and templates into Heliograf on a lot of routine and effects. Heliograph then trawls the web for information and critical phrase matches; from that, it generates reports or signals journalists to double-investigate information anomalies for potential scoops.
    Heliograph stories are straightforward studies on pursuits like elections or Olympic competitions. They are not, despite the fact, in-depth analyses — a deliberate choice on the part of the put up. In place of using a handful of neatly-researched long-form experiences to catch splintered, niche audiences, the post uses Heliograf to create a flood of small, standard reviews to attract page views.
    As an augmented intelligence which works alongside humans, Heliograf is a new beautiful model of human-machine interaction. There’s still house for humans to research and write in-depth points, from insurance of maternal mortality in us to an undercover investigation of private prisons.
    However, laptop gaining knowledge of allows AI to match human writing talents and sift through reams of data, the human-activity angle (and interviewing) will prove more durable to master. Journalists can also do less straightforward reporting, and further better-degree analysis and investigation.
    Still, ache might be unavoidable: following types of Heliograph may additionally set off massive layoffs, as newspapers cut costs by shedding local journalists and sports writers, at the same time as they keep (or increase) their investigative staff. The manufacturing industry might also present some parallels: automation increased output, costly human people were fired, and the closing jobs required increasingly advanced levels or adventure. It got here all the way down to numbers: a human welder prices $25 per hour (with benefits and vacation days), whereas robots charge simplest about $eight an hour after setting up, upkeep, and operating fees.
    Concerning the future of writing, one factor is obvious: AI writers are already here. Despite the fact, how extensive the damage could be — and how many layoffs and human suffering we will are expecting — continues to be uncertain. It is genuine that there’s a kernel of hope in the augmented intelligence model of interaction, but that does not mean writers may still rest conveniently. In a decade or two, writers may also discover themselves in the same crisis as manufacturing facility workers these days.
    Examine subsequently: FB suggests the future of media is all about UX, now not common content material

    Tuesday, September 26, 2017

    Automatically Generate Quotes for Deals in Microsoft Dynamics CRM

    Simplifying your sales process can have a huge impact on your business.  With a tool like Microsoft Dynamics CRM you can manage your entire sales process from one location.  Add WebMerge to the process and you can instantly generate documents like contract, quotes, proposals, and more.

    In this example, we’re going to show you how to automatically generate a quote when a new opportunity is added to Dynamics CRM.  We’ll then email the quote directly to our customer for their review.

    To get started, we’re going to setup the template for our quote.  We’re going to build the template using a Word document.  Inside Word, we’re going to add our repeating information like our logo, contact info, and then for the spots that we want to insert specific information about the opportunity, we’re going to use merge fields that look like: {$OpportunityName}, {$Description}, {$Customer_Name}, etc.

    These merge fields can be named anything you’d like, but cannot contain spaces or special characters.

    Here’s what our quote template looks like:
     

    Once we have our template ready, we need to upload it to WebMerge.  From the Documents page in WebMerge, click the New Document button.  Enter a name for the document, then on the next step pick Office Document as the document type then pick the file from your computer.
     

    After you upload your document, you’ll be taken to the Settings tab where you can modify various options like the type of file that is generated and the name of the file.  For this example, we’re going to produce a PDF and we’re going to include the name of the opportunity in our file name.
     

    Next, we’re going to setup the delivery of our document so that it is automatically emailed directly to our customer.  Under the Deliver tab, click the Edit button under our default email delivery.  For the “To” address, we’re going to select the merge field for our customer’s email address.  Feel free to edit any of the other email settings.
     

    After you save your email delivery, we are done with the setup process inside WebMerge and we’re ready to setup the integration with Dynamics CRM.  To help with the integration, we’re going to use our friends over a Zapier.

    Inside Zapier, we’re going to setup a new Zap.  For the Trigger, we’re going to choose Microsoft Dynamics CRM as the app, then New Opportunity as the trigger.
     

    After you authenticate your Dynamics CRM account, Zapier is going to load a test opportunity to make sure that everything is working correctly.  Follow those steps and continue.

    Next, we’re going to setup the Action of our zap and we’re going to choose WebMerge as the app, then Create Document Merge as the action.
     

    Once you authenticate your WebMerge account, Zapier is going to load a list of the documents in your account.  Go ahead and pick the quote document you just setup and Zapier is going to load a list of the merge fields in your document.

    For each of the merge fields, you need to pick the corresponding fields from Dynamic CRM.  This tells Zapier how to send your Opportunity data over to WebMerge so that it is populated in the correct spot on your template.
     

    Once you have all of your merge fields matched up, we’re going to turn our Zap on and we’re ready to run a test!  Open up Dynamics CRM and then create a new opportunity.  Zapier will detect the new opportunity and send the data over to WebMerge and your quote will be generated.

    Here's what our merged quote looked like:
     

    Congrats, you’re all done!  You can now automatically generate all types of documents from Dynamics CRM.  Can you think of any other ways that you could utilize WebMerge to simplify your paperwork process?