private void UpdateRule(
            IPluginContext context,
            AutoNumberingRule rule,
            Int32 number,
            DateTime date)
        {
            var update = new Entity(rule.TypeName, rule.Id);

            context.TracingService.Trace($"Set {rule.TypeName}.{AutoNumberingRuleEntity.LastNumberFieldName}='{number}'");

            update.AddOrUpdateAttribute(AutoNumberingRuleEntity.LastNumberFieldName(_prefix), number);

            if (rule.IsYearly())
            {
                context.TracingService.Trace($"Set {rule.TypeName}.{AutoNumberingRuleEntity.LastYearFieldName}='{date.Year}'");

                update.AddOrUpdateAttribute(AutoNumberingRuleEntity.LastYearFieldName(_prefix), date.Year);
            }
            else if (rule.IsDaily())
            {
                context.TracingService.Trace($"Set {rule.TypeName}.{AutoNumberingRuleEntity.LastDayFieldName}='{date}'");

                update.AddOrUpdateAttribute(AutoNumberingRuleEntity.LastDayFieldName(_prefix), date);
            }

            context.OrganizationService.Update(update);
        }
        private Int32 GetLastNumber(IPluginContext context, AutoNumberingRule rule, Entity parent, DateTime today)
        {
            var entityReference     = default(EntityReference);
            var lastNumberAttribute = default(String);
            var lastYearAttribute   = default(String);
            var lastDayAttribute    = default(String);

            if (rule.IsParented())
            {
                entityReference = parent.ToEntityReference();

                lastNumberAttribute = rule.LastNumberAttributeName;
                lastYearAttribute   = rule.LastYearAttributeName;
                lastDayAttribute    = rule.LastDayAttributeName;
            }
            else
            {
                entityReference = rule.ToEntityReference();

                lastNumberAttribute = AutoNumberingRuleEntity.LastNumberFieldName(_prefix);
                lastYearAttribute   = AutoNumberingRuleEntity.LastYearFieldName(_prefix);
                lastDayAttribute    = AutoNumberingRuleEntity.LastDayFieldName(_prefix);
            }

            if (lastNumberAttribute.IsNullOrEmpty())
            {
                throw new InvalidPluginExecutionException("Invalid auto-numbering configuration. Missing last number attribute name.");
            }

            if (rule.IsYearly() && lastYearAttribute.IsNullOrEmpty())
            {
                throw new InvalidPluginExecutionException("Invalid auto-numbering configuration. Missing last year attribute name.");
            }

            if (rule.IsDaily() && lastDayAttribute.IsNullOrEmpty())
            {
                throw new InvalidPluginExecutionException("Invalid auto-numbering configuration. Missing last day attribute name.");
            }

            var attributes = new[]
            {
                lastNumberAttribute,
                lastYearAttribute,
                lastDayAttribute
            };

            var entity = context.OrganizationService.Retrieve(
                entityReference.LogicalName,
                entityReference.Id,
                attributes.Where(o => !o.IsNullOrEmpty()).ToArray());

            var number = entity.GetAttributeValue <Int32?>(lastNumberAttribute);

            if (rule.IsYearly() && today.Year != entity.GetAttributeValue <Int32?>(lastYearAttribute))
            {
                return(0);
            }
            else if (rule.IsDaily() && today != entity.GetAttributeValue <DateTime?>(lastDayAttribute))
            {
                return(0);
            }

            return(number ?? 0);
        }