/// <summary>
        /// Cuando se está creando el producto y se hace clic en guardar, se ejecuta una consulta
        /// al servicio web donde consulta la puntuación del vino y actualiza el campo en el CRM.
        /// </summary>
        /// <param name="serviceProvider"></param>
        public void Execute(IServiceProvider serviceProvider)
        {
            // Se declara el contexto que hace referencia al plugin utilizado
            var context = (IPluginExecutionContext)
                          serviceProvider.GetService(typeof(IPluginExecutionContext));

            if (!context.InputParameters.Contains("Target") ||
                !(context.InputParameters["Target"] is Entity))
            {
                return;
            }

            var entity = (Entity)context.InputParameters["Target"];

            if (!entity.Attributes.Contains("productnumber"))
            {
                return;
            }

            // "productnumber" es el nombre físico del campo a trabajar en el crm
            var codigo = entity.GetAttributeValue <string>("productnumber");

            // consultar la puntuación del vino
            var puntuacion = Puntuacion.Obtener(token, codigo);

            string[] valores = puntuacion.Split(';');
            var      wine    = valores[1];
            var      score   = Convert.ToDouble(valores[0]);

            entity["evd_puntuacion"] = score;
            entity["name"]           = wine;
        }
        protected override void Execute(CodeActivityContext context)
        {
            var contextWorkflow = context.GetExtension <IWorkflowContext>();
            var serviceFactory  = context.GetExtension <IOrganizationServiceFactory>();
            var user            = contextWorkflow.InitiatingUserId;

            var organizationService = serviceFactory.CreateOrganizationService(user);

            var product = Product.Get <EntityReference>(context);
            var token   = Token.Get <string>(context);

            if (product == null || token == null)
            {
                return;
            }

            // Es equivalente a un select
            var entity     = organizationService.Retrieve("product", product.Id, new ColumnSet(true));
            var codigo     = entity.GetAttributeValue <string>("productnumber");
            var puntuacion = Puntuacion.Obtener(token, codigo);

            string[] valores = puntuacion.Split(';');
            var      wine    = valores[1];
            var      score   = Convert.ToDouble(valores[0]);

            entity["evd_puntuacion"] = score;
            entity["name"]           = wine;
            organizationService.Update(entity);
        }
        /// <summary>
        /// En caso de que se actualice la entidad, para este caso el producto, se vuelve a consultar el servicio para
        /// asegurar que la puntuación corresponda al vino, ejemplo si se cambia el código del vino.
        /// </summary>
        /// <param name="serviceProvider"></param>
        public void Execute(IServiceProvider serviceProvider)
        {
            var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));

            // Evitar que se ejecute por segunda o más veces, debido a que este método se ejecuta
            // después de una actualización en crm y en este código se le está indicando que vuelva
            // a actualizar se controla la profundidad de actualizaciones para que no se ejecute más de una vez
            if (context.Depth > 2)
            {
                return;
            }

            if (!context.PreEntityImages.Contains("PreImage") || !(context.PreEntityImages["PreImage"] is Entity))
            {
                return;
            }
            var entityPre = (Entity)context.PreEntityImages["PreImage"];

            if (!context.InputParameters.Contains("Target") || !(context.InputParameters["Target"] is Entity))
            {
                return;
            }
            var entity = (Entity)context.InputParameters["Target"];

            if (entity["productnumber"] != entityPre["productnumber"])
            {
                // "productnumber" es el nombre físico del campo a trabajar en el crm
                var codigo = entity.GetAttributeValue <string>("productnumber");
                var name   = entity.GetAttributeValue <string>("name");
                // consultar la puntuación del vino mediante servicio web
                var      puntuacion = Puntuacion.Obtener(token, codigo);
                string[] valores    = puntuacion.Split(';');
                var      wine       = valores[1];
                var      score      = Convert.ToDouble(valores[0]);
                // return new KeyValuePair<string, double?>(items.results[0].wine, score);

                // var wine = Puntuacion.Obtener(token, codigo).;
                // Asignar el valor obtenido al campo correpondiente en el CRM

                /*
                 * entity["evd_puntuacion"] = puntuacion.Value;
                 * entity["name"] = puntuacion.Value;
                 */
                entity["evd_puntuacion"] = score;
                entity["name"]           = wine;

                var serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                var service        = serviceFactory.CreateOrganizationService(context.UserId);
                service.Update(entity);
            }
        }