/// <summary> /// Change <c>Quote</c> status to <c>Won</c>. /// Please note that this action is required in order to convert a <c>Quote</c> into a <c>SalesOrder</c> with <see cref="ConvertToSalesOrder(Guid, string[])"/> method. /// <para> /// For more information look at https://msdn.microsoft.com/en-us/library/microsoft.crm.sdk.messages.winquoterequest(v=crm.7).aspx /// </para> /// </summary> /// <param name="id"><c>Quote</c> Id</param> /// <param name="status"><see cref="QuoteWonStatusCode"/> status code</param> /// <param name="customStatusCode">If you're using your custom statuscodes set this, otherwise you can set "0 (zero)" or null</param> /// <param name="quotecloseSubject"><c>QuoteClose</c> subject</param> /// <param name="quotecloseDescription"><c>QuoteClose</c> description</param> /// <param name="quotecloseActualEnd"><c>QuoteClose</c> actual end date</param> /// <returns><see cref="WinQuoteResponse"/></returns> public WinQuoteResponse Win(Guid id, QuoteWonStatusCode status, int customStatusCode = 0, string quotecloseSubject = "", string quotecloseDescription = "", DateTime?quotecloseActualEnd = null) { ExceptionThrow.IfGuidEmpty(id, "id"); int statusCode = (int)status; if (status == QuoteWonStatusCode.CustomStatusCode) { ExceptionThrow.IfNegative(customStatusCode, "customStatusCode"); statusCode = customStatusCode; } if (string.IsNullOrEmpty(quotecloseSubject)) { var quoteEntity = this.Get(id, "quotenumber"); quotecloseSubject = string.Format("Quote Close (Won) - {0}", quoteEntity.GetAttributeValue <string>("quotenumber")); } WinQuoteRequest request = new WinQuoteRequest() { QuoteClose = PrepareQuoteCloseEntity(id, quotecloseSubject, quotecloseDescription, quotecloseActualEnd), Status = new OptionSetValue(statusCode) }; return((WinQuoteResponse)this.OrganizationService.Execute(request)); }
/// <summary> /// <c>Win</c> an opportunity. /// <para> /// For more information look at https://msdn.microsoft.com/en-us/library/microsoft.crm.sdk.messages.winopportunityrequest(v=crm.7).aspx /// </para> /// </summary> /// <param name="id"><c>Opportunity</c> Id</param> /// <param name="status"><see cref="OpportunityWonStatusCode"/> status code</param> /// <param name="customStatusCode">If you're using your custom statuscodes set this, otherwise you can set "0 (zero)" or null</param> /// <param name="opportunitycloseSubject"><c>OpportunityClose</c> subjec</param> /// <param name="opportunitycloseDescription"><c>OpportunityClose</c> description</param> /// <param name="opportunitycloseActualEnd"><c>OpportunityClose</c> actual end date. Default value is <c>DateTime.UtcNow</c> or <c>DateTime.Now</c> depend on <c>useUtc</c> parameter on constructor</param> /// <param name="useOpportunityTotalAmountValue">Set <c>true</c>, if you want to use <c>Opportunity</c>'s current <c>Total Amount</c> value, otherwise if you want new value set <c>false</c> and set value of <c>opportunitycloseActualRevenue</c> parameter</param> /// <param name="opportunitycloseActualRevenue"><c>OpportunityClose</c> actual revenue.</param> /// <returns><see cref="WinOpportunityResponse"/></returns> public WinOpportunityResponse Win(Guid id, OpportunityWonStatusCode status, int customStatusCode = 0, string opportunitycloseSubject = "", string opportunitycloseDescription = "", DateTime?opportunitycloseActualEnd = null, bool useOpportunityTotalAmountValue = false, decimal opportunitycloseActualRevenue = 0) { ExceptionThrow.IfGuidEmpty(id, "id"); int statusCode = (int)status; opportunitycloseSubject = !string.IsNullOrEmpty(opportunitycloseSubject) ? opportunitycloseSubject.Trim() : "Opportunity Close - Won"; if (status == OpportunityWonStatusCode.CustomStatusCode) { ExceptionThrow.IfNegative(customStatusCode, "customStatusCode"); statusCode = customStatusCode; } if (useOpportunityTotalAmountValue) { opportunitycloseActualRevenue = GetTotalAmount(id); } WinOpportunityRequest request = new WinOpportunityRequest() { OpportunityClose = PrepareOpportunityCloseEntity(id, opportunitycloseSubject, opportunitycloseDescription, null, opportunitycloseActualEnd, opportunitycloseActualRevenue), Status = new OptionSetValue(statusCode) }; return((WinOpportunityResponse)this.OrganizationService.Execute(request)); }
/// <summary> /// Create a <c>Campaign Activity</c>. /// </summary> /// <param name="campaignId"><c>Campaign</c> Id</param> /// <param name="subject">Subject</param> /// <param name="description">Description</param> /// <param name="typeCode"><see cref="CampaignActivityTypeCode"/> type code</param> /// <param name="channelCode"><see cref="CampaignActivityChannelTypeCode"/> channel code</param> /// <param name="customTypeCode">If you're using your custom typecode set this, otherwise you can set "0 (zero)" or null</param> /// <param name="customChannelCode">If you're using your custom channel code set this, otherwise you can set "0 (zero)" or null</param> /// <returns> /// Created record Id (<see cref="Guid"/>) /// </returns> public Guid Create(Guid campaignId, string subject, string description, CampaignActivityTypeCode typeCode, CampaignActivityChannelTypeCode channelCode, int customTypeCode = 0, int customChannelCode = 0) { ExceptionThrow.IfGuidEmpty(campaignId, "campaignId"); ExceptionThrow.IfNullOrEmpty(subject, "subject"); int activityTypeCode = (int)typeCode; int activityChannelCode = (int)channelCode; if (typeCode == CampaignActivityTypeCode.CustomTypeCode) { ExceptionThrow.IfNegative(customTypeCode, "customTypeCode"); activityTypeCode = customTypeCode; } if (channelCode == CampaignActivityChannelTypeCode.CustomChannelTypeCode) { ExceptionThrow.IfNegative(customChannelCode, "customChannelCode"); activityChannelCode = customChannelCode; } Entity entity = new Entity(this.EntityName); entity["regardingobjectid"] = new EntityReference("campaign", campaignId); entity["subject"] = subject; entity["typecode"] = new OptionSetValue(activityTypeCode); entity["channeltypecode"] = new OptionSetValue(activityChannelCode); entity["description"] = description; return(this.OrganizationService.Create(entity)); }
/// <summary> /// Retrieve <c>members</c> from <c>List (marketing list)</c>. /// <para> /// Please note that if your <c>list</c> is <c>dynamic</c> it must has "Fullname" (for <c>Contact</c>, <c>Lead</c>) or "Name" (for <c>Account</c>) attribute in its query. /// Otherwise <see cref="ListMemberItemDetail.Name"/> will be <see cref="string.Empty"/>. /// </para> /// </summary> /// <param name="listId">Marketing List Id</param> /// <param name="itemPerPage"> /// Record count per page. If marketling list has more than value, method works in loop. /// It's default value <c>5000</c> and recommended range is between <c>500</c> - <c>5000</c> for better performance. /// </param> /// <returns> /// <see cref="ListMemberResult"/> for data. /// </returns> public ListMemberResult GetMemberList(Guid listId, int itemPerPage = 5000) { ExceptionThrow.IfGuidEmpty(listId, "listId"); ExceptionThrow.IfNegative(itemPerPage, "itemPerPage"); ExceptionThrow.IfEquals(itemPerPage, "itemPerPage", 0); ListMemberResult result = new ListMemberResult(); var list = this.OrganizationService.Retrieve(this.EntityName, listId, new ColumnSet("type", "membertype", "query")); if (list != null) { ListTypeCode listType = (ListTypeCode)Convert.ToInt32(list.GetAttributeValue <bool>("type")); ListMemberTypeCode membertype = (ListMemberTypeCode)list.GetAttributeValue <int>("membertype"); string query = list.GetAttributeValue <string>("query"); switch (listType) { case ListTypeCode.Static: result = PopulateStaticList(listId, membertype, itemPerPage); break; case ListTypeCode.Dynamic: result = PopulateDynamicList(query, membertype, itemPerPage); break; } } return(result); }
/// <summary> /// Successfuly <c>close (resolve)</c> an incident. /// <para> /// For more information look at https://msdn.microsoft.com/en-us/library/microsoft.crm.sdk.messages.closeincidentrequest(v=crm.8).aspx /// </para> /// </summary> /// <param name="id"><c>Incident</c> Id</param> /// <param name="status"><see cref="IncidentResolvedStatusCode"/> status code</param> /// <param name="customStatusCode">If you're using your custom statuscodes set this, otherwise you can set "0 (zero)" or null</param> /// <param name="subject"><c>Incident Resolution</c> subject</param> /// <param name="description"><c>Incident Resolution</c> description</param> /// <param name="resolveDate"><c>Incident Resolution</c> acual end date</param> /// <returns> /// <see cref="CloseIncidentResponse"/> /// </returns> public CloseIncidentResponse Resolve(Guid id, IncidentResolvedStatusCode status, int customStatusCode = 0, string subject = "Resolved Incident", string description = "", DateTime?resolveDate = null) { ExceptionThrow.IfGuidEmpty(id, "id"); int statusCode = (int)status; if (status == IncidentResolvedStatusCode.CustomStatusCode) { ExceptionThrow.IfNegative(customStatusCode, "customStatusCode"); statusCode = customStatusCode; } Entity incidentResolution = new Entity("incidentresolution"); incidentResolution["incidentid"] = new EntityReference(this.EntityName, id); incidentResolution["subject"] = subject; incidentResolution["description"] = description; if (resolveDate.HasValue && resolveDate.Value != DateTime.MinValue) { incidentResolution["actualend"] = resolveDate.Value; } CloseIncidentRequest request = new CloseIncidentRequest() { IncidentResolution = incidentResolution, Status = new OptionSetValue(statusCode) }; return((CloseIncidentResponse)this.OrganizationService.Execute(request)); }
/// <summary> /// <c>Cancel</c> the <c>SalesOrder</c>. /// <para> /// For more information look at https://msdn.microsoft.com/en-us/library/microsoft.crm.sdk.messages.cancelsalesorderrequest(v=crm.8).aspx /// </para> /// </summary> /// <param name="id"><c>SalesOrder</c> Id</param> /// <param name="status"><see cref="SalesOrderCanceledStatusCode"/> status code</param> /// <param name="customStatusCode">If you're using your custom statuscodes set this, otherwise you can set "0 (zero)" or null</param> /// <param name="ordercloseSubject"><c>OrderClose</c> subject</param> /// <param name="ordercloseDescription"><c>OrderClose</c> description</param> /// <param name="ordercloseActualEnd"><c>OrderClose</c> actual end date</param> /// <returns> /// <see cref="CancelSalesOrderResponse"/> /// </returns> public CancelSalesOrderResponse Cancel(Guid id, SalesOrderCanceledStatusCode status, int customStatusCode = 0, string ordercloseSubject = "", string ordercloseDescription = "", DateTime?ordercloseActualEnd = null) { ExceptionThrow.IfGuidEmpty(id, "id"); int statusCode = (int)status; if (status == SalesOrderCanceledStatusCode.CustomStatusCode) { ExceptionThrow.IfNegative(customStatusCode, "customStatusCode"); statusCode = customStatusCode; } if (string.IsNullOrEmpty(ordercloseSubject)) { var salesorderEntity = this.Get(id, "ordernumber"); ordercloseSubject = string.Format("Salesorder Close (Cancel) - {0}", salesorderEntity.GetAttributeValue <string>("ordernumber")); } CancelSalesOrderRequest request = new CancelSalesOrderRequest() { OrderClose = PrepareOrderCloseEntity(id, ordercloseSubject, ordercloseDescription, ordercloseActualEnd), Status = new OptionSetValue(statusCode) }; return((CancelSalesOrderResponse)this.OrganizationService.Execute(request)); }
/// <summary> /// Create an attachment from byte array. /// <para> /// For more information look at https://msdn.microsoft.com/en-us/library/gg328344(v=crm.7).aspx /// </para> /// </summary> /// <param name="emailId"><c>Email Activity</c> Id</param> /// <param name="content">File content</param> /// <param name="fileName">This will be attachment name</param> /// <returns> /// Created record Id (<see cref="System.Guid"/>) /// </returns> public Guid Attach(Guid emailId, byte[] content, string fileName) { ExceptionThrow.IfGuidEmpty(emailId, "emailId"); ExceptionThrow.IfNull(content, "content"); ExceptionThrow.IfNegative(content.Length, "content"); ExceptionThrow.IfNullOrEmpty(fileName, "fileName"); var entity = PrepareAttachmentData(emailId, content, fileName); return(this.OrganizationService.Create(entity)); }
/// <summary> /// Add a <c>Quote product</c> to <c>Quote</c> with manual product information. /// </summary> /// <param name="quoteId"><c>Quote</c> Id</param> /// <param name="productName"><c>Product Name</c></param> /// <param name="quantity"><c>Quantity</c></param> /// <param name="price"><c>Price</c></param> /// <param name="discountAmount"><c>Discount amount</c> by currency</param> /// <param name="tax"><c>Tax amount</c>by currency</param> /// <returns>Created record Id (<see cref="Guid"/>)</returns> public Guid Add(Guid quoteId, string productName, decimal quantity, decimal price, decimal?discountAmount, decimal?tax) { ExceptionThrow.IfGuidEmpty(quoteId, "quoteId"); ExceptionThrow.IfNullOrEmpty(productName, "productName"); ExceptionThrow.IfNegative(quantity, "quantity"); ExceptionThrow.IfNegative(price, "price"); var entity = XProduct.Create(this.EntityName, "quote", quoteId, null, null, productName, quantity, price, discountAmount, tax); return(this.OrganizationService.Create(entity)); }
/// <summary> /// Add a <c>Quote product</c> to <c>Quote</c> with existing <c>Product</c>. /// </summary> /// <param name="quoteId"><c>Quote</c> Id</param> /// <param name="productId"><c>Product</c> Id</param> /// <param name="uomId"><c>UoM</c> Id</param> /// <param name="quantity"><c>Quantity</c></param> /// <param name="price"><c>Price</c></param> /// <param name="discountAmount"><c>Discount amount</c> by currency</param> /// <param name="tax"><c>Tax amount</c>by currency</param> /// <returns>Created record Id (<see cref="Guid"/>)</returns> public Guid Add(Guid quoteId, Guid productId, Guid uomId, decimal quantity, decimal?price, decimal?discountAmount, decimal?tax) { ExceptionThrow.IfGuidEmpty(quoteId, "quoteId"); ExceptionThrow.IfGuidEmpty(productId, "productId"); ExceptionThrow.IfGuidEmpty(uomId, "uomId"); ExceptionThrow.IfNegative(quantity, "quantity"); var entity = XProduct.Create(this.EntityName, "quote", quoteId, productId, uomId, "", quantity, price, discountAmount, tax); return(this.OrganizationService.Create(entity)); }
/// <summary> /// <c>Qualify</c> a <c>Lead</c> and create an account, contact, or opportunity records that are linked to the originating lead. /// <para> /// For more information look at https://msdn.microsoft.com/en-us/library/microsoft.crm.sdk.messages.qualifyleadrequest(v=crm.8).aspx /// </para> /// </summary> /// <param name="id"><c>Lead</c> Id</param> /// <param name="qualifyTo">Lead qualified to entity type</param> /// <param name="existingRecordType">Existing record entity type</param> /// <param name="existingRecordId">If you qualify with existing record (account or contact) set record Id</param> /// <param name="currencyId"> /// If you want create an <c>Opportunity</c> set <c>TransactionCurrency Id</c>, otherwise leave NULL. /// <para> /// If you want create an <c>Opportunity</c> and do not know / sure <c>TransactionCurrency Id</c> leave NULL, this method will find <c>TransactionCurrency Id</c> /// </para> /// </param> /// <param name="campaignId"></param> /// <param name="status"><see cref="LeadQualifiedStatusCode"/> status code</param> /// <param name="customStatusCode">If you're using your custom statuscodes set this, otherwise you can set "0 (zero)" or null</param> /// <returns>Resturns created entities after qualification in <see cref="QualifyLeadResponse.CreatedEntities"/> property.</returns> public QualifyLeadResponse Qualify(Guid id, QualifyLeadTo qualifyTo, ExistingEntityType?existingRecordType, Guid?existingRecordId, Guid?currencyId, Guid?campaignId, LeadQualifiedStatusCode status = LeadQualifiedStatusCode.Qualified, int customStatusCode = 0) { ExceptionThrow.IfGuidEmpty(id, "id"); ExceptionThrow.IfNegative((int)qualifyTo, "qualifyTo"); int statusCode = (int)status; if (status == LeadQualifiedStatusCode.CustomStatusCode) { ExceptionThrow.IfNegative(customStatusCode, "customStatusCode"); statusCode = customStatusCode; } bool isAccount = (qualifyTo.HasFlag(QualifyLeadTo.Account) || qualifyTo.HasFlag(QualifyLeadTo.AccountAndContact) || qualifyTo.HasFlag(QualifyLeadTo.OpportunityWithAccountAndContact)) && !qualifyTo.HasFlag(QualifyLeadTo.None); bool isContact = (qualifyTo.HasFlag(QualifyLeadTo.Contact) || qualifyTo.HasFlag(QualifyLeadTo.AccountAndContact) || qualifyTo.HasFlag(QualifyLeadTo.OpportunityWithContact) || qualifyTo.HasFlag(QualifyLeadTo.OpportunityWithAccountAndContact)) && !qualifyTo.HasFlag(QualifyLeadTo.None); bool isOpportunity = (qualifyTo.HasFlag(QualifyLeadTo.OpportunityWithContact) || qualifyTo.HasFlag(QualifyLeadTo.OpportunityWithAccountAndContact) || qualifyTo.HasFlag(QualifyLeadTo.OpportunityWithExistingRecord)) && !qualifyTo.HasFlag(QualifyLeadTo.None); QualifyLeadRequest request = new QualifyLeadRequest() { LeadId = new EntityReference(this.EntityName.ToLower(), id), CreateAccount = isAccount, CreateContact = isContact, CreateOpportunity = isOpportunity, Status = new OptionSetValue(statusCode) }; if (campaignId.HasValue) { ExceptionThrow.IfGuid(campaignId.Value, "campaignId"); request.SourceCampaignId = new EntityReference("campaign", campaignId.Value); } if (isOpportunity) { var currencyEntityReference = currencyId.HasValue && !currencyId.Value.IsGuidEmpty() ? new EntityReference("transactioncurrency", currencyId.Value) : GetTransactionCurrency("lead", id); ExceptionThrow.IfNull(currencyEntityReference, "OpportunityCurrency"); ExceptionThrow.IfGuidEmpty(currencyEntityReference.Id, "OpportunityCurrency.Id"); request.OpportunityCurrencyId = currencyEntityReference; if (qualifyTo.HasFlag(QualifyLeadTo.OpportunityWithExistingRecord)) { ExceptionThrow.IfNull(existingRecordType, "existingRecordType"); ExceptionThrow.IfGuidEmpty(existingRecordId.Value, "existingRecordId"); request.OpportunityCustomerId = new EntityReference(existingRecordType.Description(), existingRecordId.Value); } } return((QualifyLeadResponse)this.OrganizationService.Execute(request)); }
/// <summary> /// Recurrence with <c>occurence(s)</c>. /// </summary> /// <param name="occurence"></param> /// <returns></returns> public XrmRecurringAppointment EndAfterXOccurences(int occurence) { ExceptionThrow.IfNegative(occurence, "occurence"); ExceptionThrow.IfEquals(occurence, "occurence", 0); SetEndPattern(); _recurrenceEndPattern = RecurrenceEndPatternType.Occurrences; _occurence = occurence; return(this); }
/// <summary> /// <c>Daily</c> recurrence with <c>every X days</c>. /// Please note that this includes alldays (weekdays and weekend). /// </summary> /// <param name="interval"><c>every X days</c> interval value.</param> /// <returns></returns> public XrmRecurringAppointment Daily(int interval) { ExceptionThrow.IfEquals(interval, "interval", 0); ExceptionThrow.IfNegative(interval, "interval"); SetRecurrence(); _recurrencePattern = RecurrencePatternType.Daily; _interval = interval; return(this); }
public static Entity Create(string entityName, string relatedEntityName, Guid relatedEntityId, Guid?productId, Guid?uomId, string productName, decimal quantity, decimal?price, decimal?discountAmount, decimal?tax) { ExceptionThrow.IfNullOrEmpty(entityName, "entityName"); ExceptionThrow.IfNullOrEmpty(relatedEntityName, "relatedEntityName"); ExceptionThrow.IfGuidEmpty(relatedEntityId, "relatedEntityId"); ExceptionThrow.IfNegative(quantity, "quantity"); Entity entity = new Entity(entityName.ToLower().Trim()); entity[string.Format("{0}id", relatedEntityName.Trim())] = new EntityReference(relatedEntityName.Trim(), relatedEntityId); entity["quantity"] = quantity; if (string.IsNullOrEmpty(productName)) { ExceptionThrow.IfNull(productId, "productId"); ExceptionThrow.IfNull(uomId, "uomId"); ExceptionThrow.IfGuidEmpty(productId.Value, "productId"); ExceptionThrow.IfGuidEmpty(uomId.Value, "uomId"); entity["productid"] = new EntityReference("product", productId.Value); entity["uomid"] = new EntityReference("uom", uomId.Value); } else { entity["isproductoverridden"] = true; entity["productdescription"] = productName; } if (price.HasValue) { ExceptionThrow.IfNegative(price.Value, "price"); entity["priceperunit"] = new Money(price.Value); entity["ispriceoverridden"] = true; } if (discountAmount.HasValue) { ExceptionThrow.IfNegative(discountAmount.Value, "discountAmount"); entity["manualdiscountamount"] = new Money(discountAmount.Value); } if (tax.HasValue) { ExceptionThrow.IfNegative(tax.Value, "tax"); entity["tax"] = new Money(tax.Value); } return(entity); }
/// <summary> /// <c>Weekly</c> recurrence. /// </summary> /// <param name="interval"></param> /// <param name="daysOfWeek"></param> /// <returns></returns> public XrmRecurringAppointment Weekly(int interval, DayOfWeek daysOfWeek) { ExceptionThrow.IfEquals(interval, "interval", 0); ExceptionThrow.IfNegative(interval, "interval"); SetRecurrence(); _recurrencePattern = RecurrencePatternType.Weekly; _interval = interval; _dayOfWeeksValue = (int)daysOfWeek; return(this); }
/// <summary> /// <c>Monthly</c> recurrence. /// </summary> /// <param name="option"></param> /// <param name="day"></param> /// <param name="interval"></param> /// <returns></returns> public XrmRecurringAppointment Monthly(MonthlyOption option, DayOfWeek day, int interval) { ExceptionThrow.IfEquals(interval, "interval", 0); ExceptionThrow.IfNegative(interval, "interval"); SetRecurrence(); _recurrencePattern = RecurrencePatternType.Monthly; _monthlyOption = option; _interval = interval; _dayOfWeeksValue = (int)day; return(this); }
/// <summary> /// Create a <c>Campaign</c>. /// </summary> /// <param name="name">Name</param> /// <param name="code">Code. /// If you don't provide this data, MS CRM gives an automated number /// </param> /// <param name="typeCode"><see cref="CampaignTypeCode"/></param> /// <param name="description"></param> /// <param name="transactioncurrencyId"></param> /// <param name="actualStart">Actual Start date</param> /// <param name="actualEnd">Actual End date</param> /// <param name="proposedStart">Propesed Start date</param> /// <param name="proposedEnd">Proposed End date</param> /// <param name="status"><see cref="CampaignActiveStatusCode"/> status code</param> /// <param name="customStatusCode">If you're using your custom statuscodes set this, otherwise you can set "0 (zero)" or null</param> /// <returns> /// Created record Id (<see cref="Guid"/>) /// </returns> public Guid Create(string name, string code, CampaignTypeCode typeCode, string description, Guid transactioncurrencyId, DateTime?actualStart, DateTime?actualEnd, DateTime?proposedStart, DateTime?proposedEnd, CampaignActiveStatusCode status, int customStatusCode = 0) { ExceptionThrow.IfNullOrEmpty(name, "name"); ExceptionThrow.IfGuidEmpty(transactioncurrencyId, "transactioncurrencyId"); int statusCode = (int)status; if (status == CampaignActiveStatusCode.CustomStatusCode) { ExceptionThrow.IfNegative(customStatusCode, "customStatusCode"); statusCode = customStatusCode; } Entity entity = new Entity(this.EntityName); entity["name"] = name; entity["typecode"] = new OptionSetValue((int)typeCode); entity["transactioncurrencyid"] = new EntityReference("transactioncurrency", transactioncurrencyId); entity["istemplate"] = false; entity["description"] = description; entity["statuscode"] = new OptionSetValue(statusCode); if (!string.IsNullOrEmpty(code)) { entity["codename"] = code; } if (actualStart.HasValue && actualStart.Value != DateTime.MinValue) { entity["actualstart"] = actualStart.Value; } if (actualEnd.HasValue && actualEnd.Value != DateTime.MinValue) { entity["actualend"] = actualEnd.Value; } if (proposedStart.HasValue && proposedStart.Value != DateTime.MinValue) { entity["proposedstart"] = proposedStart.Value; } if (proposedEnd.HasValue && proposedEnd.Value != DateTime.MinValue) { entity["proposedend"] = proposedEnd.Value; } return(this.OrganizationService.Create(entity)); }
/// <summary> /// <c>Yearly</c> recurrence with exact date. /// </summary> /// <param name="month"></param> /// <param name="day"></param> /// <param name="interval"><c>Recur every X years</c> interval.</param> /// <returns></returns> public XrmRecurringAppointment Yearly(Month month, int day, int interval) { ExceptionThrow.IfEquals(day, "day", 0); ExceptionThrow.IfNegative(day, "day"); SetRecurrence(); _isFirstOption = true; _recurrencePattern = RecurrencePatternType.Yearly; _interval = interval; _dayNumber = day; _month = month; return(this); }
/// <summary> /// <c>Monthly</c> recurrence with exact day. /// </summary> /// <param name="onDay">Excat day number</param> /// <param name="interval"><c>Every X months</c> interval value.</param> /// <returns></returns> public XrmRecurringAppointment Monthly(int onDay, int interval) { ExceptionThrow.IfEquals(onDay, "onDay", 0); ExceptionThrow.IfNegative(onDay, "onDay"); ExceptionThrow.IfEquals(interval, "interval", 0); ExceptionThrow.IfNegative(interval, "interval"); SetRecurrence(); _isFirstOption = true; _recurrencePattern = RecurrencePatternType.Monthly; _interval = interval; _dayNumber = onDay; return(this); }
/// <summary> /// Change <c>Invoice</c> status to <c>Cancelled</c>. /// <para> /// For more information look at https://msdn.microsoft.com/en-us/library/microsoft.crm.sdk.messages.setstaterequest(v=crm.7).aspx /// </para> /// </summary> /// <param name="id"><c>Invoice</c> Id</param> /// <param name="status"><see cref="InvoiceCanceledStatusCode"/> status code</param> /// <param name="customStatusCode">If you're using your custom statuscodes set this, otherwise you can set "0 (zero)" or null</param> public void Canceled(Guid id, InvoiceCanceledStatusCode status, int customStatusCode = 0) { ExceptionThrow.IfGuidEmpty(id, "id"); int statusCode = (int)status; if (status == InvoiceCanceledStatusCode.CustomStatusCode) { ExceptionThrow.IfNegative(customStatusCode, "customStatusCode"); statusCode = customStatusCode; } CommonHelper commonHelper = new CommonHelper(this.OrganizationService); commonHelper.UpdateState(id, this.EntityName, 3, statusCode); }
/// <summary> /// <c>Disqualify</c> a <c>Lead</c> and set state to passive. /// <para> /// For more information look at https://msdn.microsoft.com/en-us/library/microsoft.crm.sdk.messages.setstaterequest(v=crm.8).aspx /// </para> /// </summary> /// <param name="id"><c>Lead</c> Id</param> /// <param name="status"><see cref="LeadDisqualifiedStatusCode"/> status code</param> /// <param name="customStatusCode">If you're using your custom statuscodes set this, otherwise you can set "0 (zero)" or null</param> public void Disqualify(Guid id, LeadDisqualifiedStatusCode status, int customStatusCode = 0) { ExceptionThrow.IfGuidEmpty(id, "id"); int statusCode = (int)status; if (status == LeadDisqualifiedStatusCode.CustomStatusCode) { ExceptionThrow.IfNegative(customStatusCode, "customStatusCode"); statusCode = customStatusCode; } CommonHelper entityHelper = new CommonHelper(this.OrganizationService); entityHelper.UpdateState(id, this.EntityName, 2, statusCode); }
/// <summary> /// Change <c>Quote</c> status to <c>Closed</c>. /// <para> /// For more information look at https://msdn.microsoft.com/en-us/library/microsoft.crm.sdk.messages.closequoterequest(v=crm.7).aspx /// </para> /// </summary> /// <param name="id"><c>Quote</c> Id</param> /// <param name="status"><see cref="QuoteClosedStatusCode"/> status code</param> /// <param name="customStatusCode">If you're using your custom statuscodes set this, otherwise you can set "0 (zero)" or null</param> /// <param name="quotecloseSubject"><c>QuoteClose</c> subject</param> /// <param name="quotecloseDescription"><c>QuoteClose</c> description</param> /// <param name="quotecloseActualEnd"><c>QuoteClose</c> actual end date</param> /// <returns><see cref="CloseQuoteResponse"/></returns> public CloseQuoteResponse Close(Guid id, QuoteClosedStatusCode status, int customStatusCode = 0, string quotecloseSubject = "", string quotecloseDescription = "", DateTime?quotecloseActualEnd = null) { ExceptionThrow.IfGuidEmpty(id, "id"); int statusCode = (int)status; if (status == QuoteClosedStatusCode.CustomStatusCode) { ExceptionThrow.IfNegative(customStatusCode, "CustomStatusCode"); statusCode = customStatusCode; } var quoteEntity = this.Get(id, "quotenumber"); if (string.IsNullOrEmpty(quotecloseSubject)) { switch (status) { case QuoteClosedStatusCode.Lost: quotecloseSubject = string.Format("Quote Close (Lost) - {0}", quoteEntity.GetAttributeValue <string>("quotenumber")); break; case QuoteClosedStatusCode.Cancelled: quotecloseSubject = string.Format("Quote Close (Cancelled) - {0}", quoteEntity.GetAttributeValue <string>("quotenumber")); break; case QuoteClosedStatusCode.Revised: quotecloseSubject = string.Format("Quote Close (Revised) - {0}", quoteEntity.GetAttributeValue <string>("quotenumber")); break; } } CloseQuoteRequest request = new CloseQuoteRequest() { QuoteClose = PrepareQuoteCloseEntity(id, quotecloseSubject, quotecloseDescription, quotecloseActualEnd), Status = new OptionSetValue(statusCode) }; return((CloseQuoteResponse)this.OrganizationService.Execute(request)); }
/// <summary> /// Cancel a <c>Contract</c>. /// <para> /// For more information look at https://msdn.microsoft.com/en-us/library/microsoft.crm.sdk.messages.cancelcontractrequest(v=crm.8).aspx /// </para> /// </summary> /// <param name="id"><c>Conract</c> Id</param> /// <param name="cancellationDate"> /// Contract cancellation date. /// You can pass <c>null</c> value, default value is <see cref="DateTime.UtcNow"/> or <see cref="DateTime.Now"/> depend on <c>useUtc</c> parameter on constructor. /// </param> /// <param name="status"> /// <see cref="ContractCanceledStatusCode"/> status code /// </param> /// <param name="customStatusCode">If you're using your custom statuscodes set this, otherwise you can set "0 (zero)" or null</param> /// <returns> /// <see cref="CancelContractResponse"/> /// </returns> public CancelContractResponse Cancel(Guid id, DateTime?cancellationDate, ContractCanceledStatusCode status, int customStatusCode = 0) { ExceptionThrow.IfGuidEmpty(id, "id"); DateTime now = this._useUtc ? DateTime.UtcNow : DateTime.Now; int statusCode = (int)status; if (status == ContractCanceledStatusCode.CustomStatusCode) { ExceptionThrow.IfNegative(customStatusCode, "customStatusCode"); statusCode = customStatusCode; } CancelContractRequest request = new CancelContractRequest() { ContractId = id, Status = new OptionSetValue(statusCode), CancelDate = cancellationDate.HasValue ? cancellationDate.Value : now }; return((CancelContractResponse)this.OrganizationService.Execute(request)); }
/// <summary> /// <c>Lose</c> an opportunity. /// <para> /// For more information look at https://msdn.microsoft.com/en-us/library/microsoft.crm.sdk.messages.loseopportunityrequest(v=crm.7).aspx /// </para> /// </summary> /// <param name="id"><c>Opportunity</c> Id</param> /// <param name="competitorId">Competitor</param> /// <param name="status"><see cref="OpportunityLostStatusCode"/> status code</param> /// <param name="customStatusCode">If you're using your custom statuscodes set this, otherwise you can set "0 (zero)" or null</param> /// <param name="opportunitycloseSubject"><c>OpportunityClose</c> subject</param> /// <param name="opportunitycloseDescription"><c>OpportunityClose</c> description</param> /// <param name="opportunitycloseActualEnd"><c>OpportunityClose</c> actual end date. Default value is <c>DateTime.UtcNow</c> or <c>DateTime.Now</c> depend on <c>useUtc</c> parameter on constructor</param> /// <param name="opportunitycloseActualRevenue"><c>OpportunityClose</c> actual revenue. Mostly this parameter's value is 0 (zero) when you lost an opportunity</param> /// <returns><see cref="LoseOpportunityResponse"/></returns> public LoseOpportunityResponse Lose(Guid id, Guid?competitorId, OpportunityLostStatusCode status, int customStatusCode = 0, string opportunitycloseSubject = "", string opportunitycloseDescription = "", DateTime?opportunitycloseActualEnd = null, decimal opportunitycloseActualRevenue = 0) { ExceptionThrow.IfGuidEmpty(id, "id"); int statusCode = (int)status; opportunitycloseSubject = !string.IsNullOrEmpty(opportunitycloseSubject) ? opportunitycloseSubject.Trim() : "Opportunity Close - Lose"; if (status == OpportunityLostStatusCode.CustomStatusCode) { ExceptionThrow.IfNegative(customStatusCode, "customStatusCode"); statusCode = customStatusCode; } LoseOpportunityRequest request = new LoseOpportunityRequest() { OpportunityClose = PrepareOpportunityCloseEntity(id, opportunitycloseSubject, opportunitycloseDescription, competitorId, opportunitycloseActualEnd, opportunitycloseActualRevenue), Status = new OptionSetValue(statusCode) }; return((LoseOpportunityResponse)this.OrganizationService.Execute(request)); }
/// <summary> /// Validate <see cref="XrmRecurringAppointment"/> required fields by patterns and throws exception if values not expected. /// </summary> public void Validate() { ExceptionThrow.IfEquals(_startTime, "StartTime", DateTime.MinValue); ExceptionThrow.IfEquals(_endTime, "EndTime", DateTime.MinValue); ExceptionThrow.IfEquals(_startRangeDate, "StartRange", DateTime.MinValue); #region | Validate Recurrence Pattern | switch (_recurrencePattern) { case RecurrencePatternType.Daily: if (_isEveryWeekday) { ExceptionThrow.IfEquals(_dayOfWeeksValue, "Days Of Week", 0); ExceptionThrow.IfNegative(_dayOfWeeksValue, "Days Of Week"); ExceptionThrow.IfNotExpectedValue(_dayOfWeeksValue, "Days Of Week", 62); } else { ExceptionThrow.IfEquals(_interval, "Interval", 0); ExceptionThrow.IfNegative(_interval, "Interval"); } break; case RecurrencePatternType.Weekly: ExceptionThrow.IfEquals(_dayOfWeeksValue, "Days Of Week", 0); ExceptionThrow.IfNegative(_dayOfWeeksValue, "Days Of Week"); ExceptionThrow.IfGreaterThan(_dayOfWeeksValue, "Days Of Week", 127); ExceptionThrow.IfEquals(_interval, "Interval", 0); ExceptionThrow.IfNegative(_interval, "Interval"); break; case RecurrencePatternType.Monthly: ExceptionThrow.IfEquals(_interval, "Interval", 0); ExceptionThrow.IfNegative(_interval, "Interval"); if (_isFirstOption) { ExceptionThrow.IfEquals(_dayNumber, "Day", 0); ExceptionThrow.IfNegative(_dayNumber, "Day"); } else { ExceptionThrow.IfEquals(_dayOfWeeksValue, "Days Of Week", 0); ExceptionThrow.IfNegative(_dayOfWeeksValue, "Days Of Week"); ExceptionThrow.IfGreaterThan(_dayOfWeeksValue, "Days Of Week", 127); } break; case RecurrencePatternType.Yearly: ExceptionThrow.IfEquals(_interval, "Interval", 0); ExceptionThrow.IfNegative(_interval, "Interval"); ExceptionThrow.IfEquals((int)_month, "Month", 0); ExceptionThrow.IfNegative((int)_month, "Month"); if (_isFirstOption) { ExceptionThrow.IfEquals(_dayNumber, "Day", 0); ExceptionThrow.IfNegative(_dayNumber, "Day"); } else { ExceptionThrow.IfEquals(_dayOfWeeksValue, "Days Of Week", 0); ExceptionThrow.IfNegative(_dayOfWeeksValue, "Days Of Week"); ExceptionThrow.IfGreaterThan(_dayOfWeeksValue, "Days Of Week", 127); } break; } #endregion #region | Validate Recurrence End Pattern | switch (_recurrenceEndPattern) { case RecurrenceEndPatternType.NoEndDate: break; case RecurrenceEndPatternType.Occurrences: ExceptionThrow.IfNegative(_occurence, "Occurence"); ExceptionThrow.IfEquals(_occurence, "Occurence", 0); break; case RecurrenceEndPatternType.WithEnddate: ExceptionThrow.IfEquals(_endRangeDate, "EndRange", DateTime.MinValue); break; } #endregion }