private us_autonumber GetTargetAutoNumberRecord(Int32 type)
            {
                QueryExpression qry = new QueryExpression()
                {
                    EntityName = "us_autonumber",
                    ColumnSet  = new ColumnSet(EntityMetadata <us_autonumber> .AttributeName(a => a.us_autonumberId),
                                               EntityMetadata <us_autonumber> .AttributeName(a => a.us_next_number),
                                               EntityMetadata <us_autonumber> .AttributeName(a => a.us_entity_name),
                                               EntityMetadata <us_autonumber> .AttributeName(a => a.us_field_name),
                                               EntityMetadata <us_autonumber> .AttributeName(a => a.us_digits),
                                               EntityMetadata <us_autonumber> .AttributeName(a => a.us_postfix),
                                               EntityMetadata <us_autonumber> .AttributeName(a => a.us_prefix),
                                               EntityMetadata <us_autonumber> .AttributeName(a => a.us_preview))
                };

                qry.Criteria.AddCondition(EntityMetadata <us_autonumber> .AttributeName(a => a.us_entity_name), ConditionOperator.Equal, PluginCtx.PrimaryEntityName);
                qry.Criteria.AddCondition(EntityMetadata <us_autonumber> .AttributeName(a => a.statuscode), ConditionOperator.Equal, 1); //Active
                qry.Criteria.AddCondition(EntityMetadata <us_autonumber> .AttributeName(a => a.us_type), ConditionOperator.Equal, type);

                qry.AddOrder(EntityMetadata <us_autonumber> .AttributeName(a => a.us_autonumberId), OrderType.Ascending);

                List <us_autonumber> autoNumberIdList = OrgSvc.RetrieveMultiple(qry).Entities.Cast <us_autonumber>().ToList();

                if (autoNumberIdList.Count() == 0)
                {
                    throw new InvalidPluginExecutionException($"No active auto-number record found for {PluginCtx.PrimaryEntityName}");
                }
                else if (autoNumberIdList.Count() > 1)
                {
                    throw new InvalidPluginExecutionException($"Multiple active auto-number records found for {PluginCtx.PrimaryEntityName}");
                }

                return(autoNumberIdList.First());
            }
            private void LockAutoNumberRecord(us_autonumber autoNumber)
            {
                var lockingUpdate = new us_autonumber()
                {
                    Id         = autoNumber.Id,
                    us_preview = "Lock"
                };

                OrgSvc.Update(lockingUpdate);
            }
            public override void ExecutePlugin()
            {
                Trace("Plugin Start");
                var triggerEvent = PluginCtx.MessageName;

                Trace("Has us_opportunitytype " + Target.Contains("us_opportunitytype").ToString());

                var opportunutytype = Target.GetAttributeValue <OptionSetValue>("us_opportunitytype");

                if (opportunutytype == null)
                {
                    return;
                }

                Trace("opportunutytype " + opportunutytype.Value.ToString());
                us_autonumber autoNumber = GetTargetAutoNumberRecord(opportunutytype.Value);

                LockAutoNumberRecord(autoNumber);

                var targetAttribute = autoNumber.us_field_name;

                Trace("targetAttribute " + targetAttribute.ToString());

                if (PluginCtx.MessageName == PluginMessage.Update && !Target.Contains(targetAttribute))
                {
                    return;  // Continue, if this is an Update event and the target does not contain the trigger value
                }
                else if (Target.Contains(targetAttribute) && !string.IsNullOrWhiteSpace(Target.GetAttributeValue <string>(targetAttribute)))
                {
                    return;  // Continue so we don't overwrite a manual value
                }
                else if (triggerEvent == PluginMessage.Update && PreImage.Contains(targetAttribute) && !string.IsNullOrWhiteSpace(PreImage.GetAttributeValue <string>(targetAttribute)))
                {
                    return;  // Continue, so we don't overwrite an existing value
                }

                var numDigits = autoNumber.us_digits;

                Trace("numDigit " + numDigits);
                var prefix  = string.Empty;
                var postfix = string.Empty;

                if (autoNumber.Contains(EntityMetadata <us_autonumber> .AttributeName(a => a.us_prefix)))
                {
                    prefix = ReplacePredefined(autoNumber.us_prefix);
                }
                if (autoNumber.Contains(EntityMetadata <us_autonumber> .AttributeName(a => a.us_postfix)))
                {
                    postfix = ReplacePredefined(autoNumber.us_postfix);
                }

                Trace("autoNumber.us_next_number.Value " + autoNumber.us_next_number);
                //Trace("autoNumber.us_next_number.Value " + autoNumber.us_next_number);
                var number = numDigits == 0 ? "" : autoNumber.us_next_number.Value.ToString("D" + numDigits);

                Trace("Number " + number.ToString());

                Target[targetAttribute] = $"{prefix}{number}{postfix}";

                var updatedAutoNumber = new us_autonumber()
                {
                    Id             = autoNumber.Id,
                    us_next_number = autoNumber.us_next_number + 1,
                    us_preview     = Target[targetAttribute].ToString()
                };

                OrgSvc.Update(updatedAutoNumber);
            }