Un mes lleno de eventos Salesforce y Sorpresas – Gracias!!

Hace ya un tiempo que no he podido escribir y contar como van las cosas, pues he tenido un mes lleno de eventos!

Este mes ha sido muy excitante y movido. Como sabéis el día 2 de Mayo me nombraron Force.com MVP  y me gustaría aprovechar esta oportunidad para agradecer a todos los que me nominaron y me votaron para llegar a conseguirlo. A los que me ayudaron en el camino, y a todos los que me felicitaron por conseguirlo. Llevo tiempo trabajando con la plataforma Salesforce y esto para mi es algo muy importante ya que solamente existen en el mundo 27, no había ninguna mujer y ningún español. Ahora hay 2 mujeres y una es Española, ¡Olé!. De corazón muchas gracias.

Solamente decir que intentaré seguir ayudando en lo que pueda, compartir lo que sepa y por supuesto seguir aprendiendo. Aunque tenga el título de Force.com MVP me queda muchísimo por aprender.

Pues bien continuando el mes, el siguiente evento importante fue Salesforce1 World Tour, celebrado el día 22 de Mayo. Fue un solo día, muchas cosas para un solo día. Llegué alrededor de las 8 de la mañana y tuve que irme sobre las 6 de la tarde. Volví a coincidir con grandes, hice una pequeña presentación en el Teatro de desarrolladores, hablar con nueva gente, y además tuve el gran honor de participar en el stand de “Preguntas” de Salesforce y poder ayudar a resolver algunas dudas. Y por supuesto hacer algunos selfies.

Tras Saleforce1 World Tour, vuelo de vuelta a España camino a … la Universidad de Granada!! Fui invitada a dar una pequeña charla/ conferencia sobre Salesforce y como llegar a desarrollar en la plataforma. La verdad estaba súper nerviosa y emocionada ya que fue allí donde yo hice mi carrera.  Allí estaba yo, el día 28 , en la sala de eventos y conferencias, de la Escuela Técnica de Ingeniería Informática y Telecomunicaciones. Tras hora y media sin parar de hablar de Salesforce, he de decir, que fue genial, como siempre muy nerviosa pero los alumnos que asistieron me acogieron bastante bien, y como digo tras este tiempo pensaba que estarían deseando salir, pero tenían preguntas, ¡querían saber más! Genial, me gustó bastante contar que es Salesforce y como hay un futuro en cloud.

Aquí no acaba mi mes, un día después vuelvo a Inglaterra y tres días mas tarde me veo en camino… ¡a San Francisco! ( le estoy tomando ya el gustillo a eso de volar a América este año). El día 1 de Junio estaba en San Francisco, súper, súper nerviosa para la semana que me esperaba. El día 4 de Junio hice una presentación en FinancialForce dev talks y los días 5 y 6 fueron unos de los mas grandes de mi carrera profesional, tuve el gran honor de asistir al MVP Summit y conocer en persona a todos los demás MVPs tanto Salesforce como Force.com. Conocer a grandes profesionales, inteligentes, espectaculares y fantásticas personas. ¡Fue Estupendo! . Súper, súper agradecida por esa oportunidad.

Pasamos al día 7 de Junio, de vuelta a Inglaterra de nuevo pero no por mucho, ya que el día 11 estaba de nuevo en camino a España para poder hacer el Workshop. Introducción a Salesforce y Workshop que tuvo lugar el día 13 de Junio, sin supersticiones ( bueno yo un poquito). Pues fue bastante bien, en total fuimos 25 asistentes y propios representantes de Salesforce vinieron desde Madrid para dar y presentar a los asistentes Salesforce. La verdad bastante contenta, la gente hizo el workshop, había preguntas y muy buenas ideas para poner en practica. Realmente un gran día.

 

Hasta aquí, este fue el final de mi súper mes, todo lleno de eventos relacionados con Salesforce. Estupendo! Muchas gracias a todos los que habéis sido parte de este y a los que estáis en estos momentos leyendo. Echadle un vistazo a los otros post, para ver el Workshop, algunos videos y por supuesto los selfies. Hasta pronto!

 

… y ahora algunas fotos de este mes. Gracias!!

FFADevTalks4 FFADevTalks3   20140606_185443 20140605_091403

20140606_151254(0) 20140606_183542 20140605_170537 20140606_084208 20140606_070228 20140605_125548 20140606_184051 IMG-20140625-WA0001FFADevTalks2

Introducción a la plataforma Salesforce + Workshop: Granada DUG

Poco a poco vamos creciendo!!

El día 28 de Mayo tuve la gran oportunidad de ser invitada a la Universidad de granada para dar una charla sobre Salesforce. La verdad no me lo podía creer. En la escuela donde yo estudié mi carrera, en el salón de conferencias donde tantas veces me senté a escuchar, ahora era yo la que estaba allí lista para hablar de Salesforce y como llegar a ser desarrollador en dicha plataforma.

GranadaUni   IMG-20140528-WA0007

Pues tras hablar durante hora y media, los estudiantes estaban allí sentados y dispuestos a hacer preguntas, ¡Tenían preguntas! Genial. Pues bien muchos de estos estudiantes vinieron a la introducción y workshop del día 13. En total fuimos 25!

Pero no fueron los únicos en venir, directamente desde Madrid como invitados de honor tuvimos unos grandes colaboradores, Eduardo Sánchez Platform Account Executive (@EduardoSFDC)  e Ignacio Saenz Abenza Alliences Manager , ambos para España y Portugal.

Cuando les comenté la idea, sin dudarlo ofrecieron su ayuda, pero no solo eso, viajaron desde Madrid para hacer la presentación e introducción a Salesforce, que más podía pedir que los propios representantes de Salesforce en España viniesen a nuestro workshop.

De verdad estoy súper agradecida por ello. Muchas gracias!!

Ellos se encargaron de hacer una presentación espectacular a Salesforce, explicar a los asistentes las diferentes posibilidades de la plataforma, como Salesforce esta creciendo día a día, cuantos clientes confían ya en Salesforce , no podía pedir mas.

Aquí tenéis los videos de la presentación.

Y seguidamente tras la presentación pudimos hablar con los asistentes, saber mas sobre ellos, ellos tuvieron la oportunidad de hacer preguntas y conocer un poco más de la plataforma teniendo información de primera mano de Salesforce! Gracias Eduardo! Gracias Nacho. ( Y perdón por la foto, no sale muy bien pero no puedo resistir publicar el selfie, es el anño de los Selfies!! )

20140613_184729

Tras la pausa comenzamos nuestro workshop. Unas tres horas y media de workshop!. Y tras finalizar nos tomamos unas tapas.

Ah! Y se me olvidaba entre los asistentes se repartieron libros, camisetas , bolígrafos, cuadernos y se sortearon dos cargadores portátiles para móvil.

Debo de dar las gracias también a Aborda por su apoyo y contribución.

20140612_233239

Pero no penséis que terminamos aquí, la idea es tener estos mini eventos trimestralmente. Poder compartir nuestra experiencia, y sobre todo que la comunidad española de Salesforce crezca.

Así que posiblemente el próximo DUG sea en Septiembre y ya hay algunas ideas en mente,

Además es muy posible que organice el DUG en otras ciudades que no sean Granada, ahora mismo estoy intentando organizar uno en Madrid, la fecha aun no está decidida pero ya os iré informando, cuando tenga todo lo necesario.

Si queréis saber mas sobre el grupo, reuniones, material … todas las noticias las podéis encontrar en este link: South Spain Salesforce Developers Group.

 

Por supuesto algunas otras fotos del día:

20140613_161255 20140613_161300 20140613_164117 20140613_164126 20140613_172307 20140613_184456 20140613_172313

 

Salesforce1 World Tour en Londres

El pasado 22 de Mayo tuve la oportunidad de asistir a Salesforce1 World Tour en Londres.

Hacia 3 años que no había podido volver, y este año estaba de nuevo de vuelta, genial.

Se celebraba de nuevo en el edificio ExCeL  ( si estáis pensando, anda como Microsoft Excel… no!, ya me pasó a mí. Es por Exhibition Centre London)

Pues bien a las 8.30 am estaba en el edificio, directa a la zona de registro. Este año la cinta que acompañaba al badge de identificación era de colores dependiendo si eras desarrollador, partner…etc. Una vez pasado el registro, como era de esperar fui directamente a la zona de desarrolladores. En el teatro era donde durante todo el día se iban a hacer sesiones y una de ellas era la mía. ( estaba súper nerviosa!…. como siempre me pasa )

A primera hora , la primera sesión era la de Jon Stevenson: A developers tour of the Salesforce1 platform,2014-05-22 09.00.24

y seguidamente Andy y Agustina hicieron una sesión conjunta sobre flow: Clicks not code with Salesforce flow.

2014-05-22 09.35.52

Y después de esta sesión hay una pausa para dar paso al Keynote. Este año tuve una gran sorpresa, pude sentarme en primera fila y la aplicación en la que había trabajado para Dreamforce fue presentada en dicho keyno . Vamos no me lo podía creer sentada a tan solo unos metros tenia hablando frente a mi a Peter Coffee ( quien en menos de un mes, tuve la oportunidad de conocer en persona) , George Hu e incluso Fergus Griffin.

2014-05-22 10.19.20

Tras dicho keynote, el almuerzo fue servido. Cuando digo servido me refiero a una serie de aperitivos y bebidas que podias tomar mientras se tenia la oportunidad de conversar con diferentes representantes de varias compañías, tanto desarrolladores, partners, consultores, enterpreneurs …

Tras el lunch, que con los nervios no pude comer mucho la verdad, volví al Dev zone, Simon Goodyear estaba terminando su sesión: Coding the Salesforce1 platform with Apex, seguidamente Francis Pindar habló de los 10 Apex comandaments y tras él era mi turno conectado el ordenador, pantalla y sonido, me dispuse a hablar. Realmente hay momentos que con los nervios no sabes bien si lo estás diciendo correctamente ,si algo se te olvida… pero hey Don’t panicm, intentar hacerlo lo mejor posible y que la idea llegue a la gente.

Una vez terminada mi sesión Chris Lewis y Simon G. comenzaron su sesión: Coding the Salesforce User Interface,

2014-05-22 14.11.04

seguido de Keir Bowden: Responsive design with Visualforce Pages,

20140522_144335

y sin parar Simon Lawrence junto con Chris Lewis continuó con Testing from the trenches.

Tras estas sesiones no pude quedarme a las siguientes que fueron:

James Melville & Sebastian Wagner: Managing multiple orgs with continuous integration and Git

Vincent Spehner & John Stevenson:  Creating Scalable Customer facing apps on Heroku

Richard Donkin: Integrating Web apps with Force.com Canvas.

Me las perdí porque fui al stand de “ Preguntas”  donde junto con otros MVPs intentas resolver preguntas de diferentes clientes, consultores, cualquier persona que tuviese una pregunta. Allí tuve la oportunidad de contestar varias preguntas y hacer otras cuantas por supuesto, como siempre digo, me queda mucho por aprender.

Y tras pasar unas tres horas en el stand tuve que marchar directa a coger el tren de vuelta a casa.

En resumen fue un gran día, volver a ver a grandes, conocer a muchos nuevos, como la comunidad crece, mas y mas gente cada día forma parte de Salesforce y usa Salesforce1. Ojalá algún día tengamos un evento come este en España.

 

Aqui os dejo unas fotitos del evento.

La primera y mi favorita. Una con mi mentor Keir Bowden.

 20140522_153159

Esta es de cuando estaba hablando en mi session y la es un selfie en el stand de preguntas con Phil Walton y Keir Bowden

2014-05-22 14.23.14     20140522_153018

otras del Dev zone theatre

20140522_144443  2014-05-22 09.03.14

Esta la hice justo antes antes de llegar al evento y la siguiente como ya imagináis durante el evento

2014-05-22 08.21.52   20140522_142715

Y por ultimo, las fotos desde mi silla , primera fila en el keynote

 2014-05-22 10.59.33

Creando una Comunidad

Crear una comunidad en Salesforce es mas simple de lo que piensas. Hace un tiempecillo que no volvía a revisar comunidades pero la pasada semana en el trabajo una compañera estuvo preguntándome como crear una comunidad, como dar permisos a los usuarios, como hacer la comunidad publica y que se pueda auto registrar un cliente… una serie de preguntas que quizás tu también tengas. Pues vamos a crear una comunidad para probar y ver como va todo esto.

Para empezar obviamente necesitas tener una organización, que puedes conseguir aquí: https://www.salesforce.com/uk/form/signup/freetrial-sales-pe.jsp

Una vez que tengas tu organización debes activar comunidades en tu org para ello debes hacerlo llendo a  Customize -> Communities-> Enable Communities

 

communidad-1

Por defecto no vienen habilitadas.

Y ahora es hora de tomar una decisión. ¿Qué dominio usar?

Normalmente como la ayuda contextual dice usaríamos el nombre de la empresa o cuenta, ya que al fin y al cabo dicha comunidad pertenecerá para siempre a esa organización y a dicha empresa. Pero si no la nombras como tu compañía intenta darle un nombre que haga referencia a lo que tengas en dicha organización , ya que una vez habilitadas comunidades no se pueden deshabilitar o borrar.

manageComm

¡Ya tenemos activas Comunidades! ¡Ya podemos crear comunidades dentro de nuestra organización! Para ello, nos dirigiremos a Customize à Communities à Manage Communities, pulsamos el botón “Crear Comunidad“, rellenamos los campos necesarios y ya la tenemos.  Pero ahora empieza lo mas divertido.

Oh! Pero antes de nada vamos a activar la cabecera de la comunidad así todos podemos ver que en esta organización existe una comunidad. Lo hacemos modificando el perfil, activando el checkbox : View Global Header

Screenshot 2014-05-18 14.46.20

Y ahora pasamos a:

¿Qué miembros serán los que compongan esta nuestra comunidad?

Debemos seleccionas aquellos perfiles de usuarios, los cuales ya existen en nuestra organización o que puedan ser creados en el futuro, que puedan acceder a la comunidad que estamos creando

Screenshot 2014-05-18 14.47.18

¿Qué Tabs vamos a incluir en nuestra comunidad o páginas?

Necesitaremos darle acceso al usuario a una serie de tabs o paginas que deseemos dicho usuario interactúe con ellas.

Screenshot 2014-05-18 15.37.32

¿Cómo va a ser el aspecto de la comunidad?

Mediante una serie de clicks tenemos la oportunidad de configurar nuestra comunidad

Screenshot 2014-05-18 15.39.02

¿Cómo vamos a configurar el acceso a nuestra comunidad?

Tenemos dos opciones, dejarla privada para aquellos usuarios que ya pertenecen a nuestra organización, y aquellos nuevos usuarios que el administrador cree y quiera agregar a la comunidad.. o podemos hacerla publica y configurarla para que usuarios externos a nuestra org se registren.

Para permitir que usuarios o clientes externos se conected debemos modificar algo de código, pero denuevo muy sencillo.

Hay una clase que se llama: CommunitiesSelfRegController. Dicha clase es el controlador de una pagina visualforce ( la pagina si no queremos no tenemos por que modificarla ). Luego en esta clase debemos decir que cuenta será la “propietaria” de nuestra comunidad.

¿Cómo configuramos la clase CommunitiesSelfRecController?

Necesitamos el ID de la cuenta que vamos a usar. Para ello nos dirigimos a la cuenta, y la url cogemos los últimos 15 caracteres que aparecen en ella después de /

Por ejemplo:https://na17.salesforce.com/001o0000002l8RX donde el Id que buscamos es ‘001o0000002l8RX’

Antes de irnos Activamos la cuenta para ser “External Account” .

Una vez que tenemos el ID nos vamos a la clase CommunitiesSelfRegController, y en ella buscamos la línea :


String accountId = '’; // To be filled in by customer.

Es aquí donde ponemos el Id, quedando de la forma


String accountId = '001o0000002l8RX '; // To be filled in by customer.

Luego, cada vez que un cliente o usuario externo se “auto registre” y cree un nuevo usuario, se consumirá una licencia, se le asignará un perfil y se creara un nuevo contacto que pertenecerá a la cuenta que hemos usado en dicha clase controlador.

Entonces, sabemos la cuenta pero ¿cómo sabemos que perfil se asignará al nuevo usuario? Ello dependerá del perfil que se le haya configurado.

Para configurar que perfil se le asignará, se puede hace de dos formas diferentes. De nuevo mediante código o en configuración de la comunidad en la opción de Login.

Screenshot 2014-05-18 17.59.49

Si se le dice un perfil en dicha pantalla y además se le dice el perfil mediante código en la clase controlador, siempre tomará el de la clase controlador sin importarle el perfil que se le haya configurado manualmente. (Ten mucho cuidadito con ello) .

Y otra cosita, las licencias consumidas son de timo Customer Community . Comprueba que tienes licencias suficientes para tus usuarios.

Para comprobar las licencias que tu organización tiene dirigete a : Setup -> Administration Setup -> Company Profile -> Company Information.

¿Cómo van a ser enviados los emails?

Esta seria nuestra siguiente pregunta, ¿como manejamos la comunicación? ¿qué usuario será el que mande emails de bienvenida a los nuevos componentes de nuestra comunidad? ¿podemos usar algún template por defecto?

Todo esto se puede manejar desde la opción emails de nuestra comunidad. De nuevo con unos simples clicks.

Screenshot 2014-05-18 18.00.48

Pues bien ya estaría todo, de nuevo recordar que compruebes las licencias que tienes en tu org para ver si puedes dejar a nuevos usuarios que formen de ella 🙂

¡Bienvenidos a esta nuestra comunidad!

 

 

 

2×1: Primer DUG en Granada + semana del desarrollador de Salesforce1

Que mejor ocasión para celebrar nuestro primer DUG que la semana de los desarrolladores de Salesforce1. Sí!! Como lo leéis Salesforce nos ha dedicado una semana a nosotros los que solemos “picar” código! MUNDIALMENTE!!

Como lo ves, ha sido un evento global.

Vayamos por partes. No sé si conocerás lo que es DUG, seguro que sí. Pero por si acaso te cuento un poquito por si te gusta y te vienes al próximo.

Salesforce DUG es una reunión que se organiza a fin de compartir conocimientos, experiencias, ideas …. Todo relacionado con Salesforce. Suelen ser para desarrolladores, bueno eso es lo que dice el titulo Developer User Group, sin embargo toda persona es bienvenida. De igual manera toda persona que le interese Salesforce, aquellos que conocen Salesforce  como los que les gustaría conocerlo.

Quizás ahora te estés preguntando, cuanto cuesta asistir a este tipo de reuniones?

Es totalmente gratuito.

2014-05-02 17.50.54

La filosofía de Salesforce es compartir y para ello Salesforce nos ayuda dándonos la posibilidad de organizar estos grupos, donde charlar, contar nuestras experiencias en Salesforce y tomarnos unas pizzas o en nuestro caso unas tapas juntos. Que también forma parte del DUG.

Yo, personalmente, me encargo de organizar uno en España, Granada y el día 2 de Mayo fue nuestra reunión inaugural!!

Si!! Ya hemos tenido una!! Y lo hemos celebrado formando parte de la semana internacional del desarrollador de Salesforce1.

Que mejor ocasión que esa?!!

Nuestra primera reunión fue totalmente basada en Salesforce1.

Al principio la gente estaba intrigada al ver en el titulo de la reunión S1 Developer Week. De que se trata? Que vamos a hacer?

Pues bien hemos tenido, toda una presentación y demos en Salesforce1. Hicimos mini-hacks, hubo hands-on y la gente tuvo una mejor visión de cómo funciona Salesforce1.

Una cosa que me gusto mucho: Preguntas!! Había preguntas y la gente estaba interesada en saber mas!!

Sobre todo les gustó el mini-hack , bueno y las camisetas también 🙂

2014-05-02 17.52.22 2014-05-02 17.53.20

 Además, esto mismo ha sido a nivel mundial, desarrolladores de todas partes del mundo se han reunido esta semana para hablar y conocer más sobre Salesforce1.

2014-05-02 17.53.54 2014-05-02 17.54.25

Ha sido increíble como hemos estado conectados. Y aunque nuestra primera reunión fue un poco pequeñita, espero que sigamos creciendo y creciendo!!

Para aquell@s que estéis interesados en hacer el workbook que repartimos aquí os dejo el link: S1 Workbook 

Las camisetas no os las puedo dejar por aquí, pero si podéis asistir al próximo seguro que tendremos más.

Por lo pronto ya tengo la fecha de la siguiente donde haré una presentación a la plataforma y un Workshop, y por supuesto tomaremos unas tapas al terminar!!

Pero una cosa IMPORTANTE no solo yo haré presentaciones, si estas interesado en venir y compartir con nosotros alguno de tus proyectos o ideas no lo dudes, solamente ponte en contacto conmigo y te esperamos en el próximo DUG!!

¡Te esperamos!

2014-05-02 20.18.04 2014-05-02 20.19.07

 

 

 

 

La lectura de esta semana

Hace tiempo vi un libro que me llamó la atención :  Developing Applications with Salesforce Chatter y fui dejando pasar el tiempo hasta que no hace mucho dije, me lo pido! Y este fin de semana me puse manos a la lectura.

Como bien su titulo dice trata de Salesforce Chatter, es sencillo y rápido de leer. Sin embargo puede que para leer  y entender en su totalidad este libro quizás sería bueno estar familiarizado con Apex  y  tener también un poco de conocimientos sobre Visualforce.

La idea del libro me atrajo ya que está relacionado con Chatter y Salesforce siempre ha dejado claro el camino hacia “Lo social” y “El trabajo  collaborativo”.

Durante el primer capitulo intentará explicar los variados beneficios que Chatter puede aportar a las diferentes empresas.  Quizás puedas llegar a pensar en un determinado momento que se trata de una estrategia comercial pero la finalidad no es esa.  Luego tras comparar una forma antigua de negocio con la forma que Chatter podría impulsar cualquier negocio pasará a es explicar un poco el modelo  de datos de Chatter.

En los siguientes capítulos te guiara paso a paso para configurar tu Chatter en tu organización. Quizás aquí me paro un poco a pensar, realmente es muy útil si no has visto antes Chatter, y por supuesto os recomiendo que le echéis un vistazo para usarlo de ayuda en la configuración pero de nuevo puedo pensar que echo de menos una explicación inicial a que es Chatter.  Como pequeña anotación si el libro esta dedicado a newbies seria bueno un poco mas de intro. Aun asi seguro que en el uso de los ejemplos y a través de la guía el usuario es mas que capaz de saber la finalidad de chatter y que es en sí.

Y para finalizar los últimos capítulos están basados en como desarrollar , programáticamente aplicaciones que usan chatter. Podras encontrar en estos capítulos bastantes ejemplos bien detallados y con visualización lo cual te ayuda a su mejor entendimiento. Es aquí donde quizás si no te encuentras familirizado con Apex y Visualforce cueste un poquito mas, pero seguro que como digo tras la visualización es bastante sencillo de ententer. En dichos ejemplos te incluyen también un caso de uso y la manera de usar Chatter Rest API.

Resumiendo, este libro puede servirte de ayuda a la hora de ponerte manos a la obra usando Chatter, pero recuerda que quizás necesites un poquito de  familiarización con conceptos en Apex ( como Batch Jobs), y  entender un poquito la estructura de las paginas Visualforce.  Pero al fin y al cabo un buen punto de partida.

Batch Jobs: Concurrencia y Experiencia de usuario (part 1)

Trabajando con mi Business Analyst  ( cuando digo mi, no es que me haya comprado un Analista de Negocio para mí sola, es que  trabajaba conmigo en el mismo equipo )  me encontré con una serie de casos en los cuales necesitábamos procesar grandes cantidades de datos… ya sabéis que el mundo contable es una fiesta!! Tuvimos una serie de problemillas intentando no tener datos procesados a la vez por diferentes usuarios, por el mismo usuario incluso, no tener resultados dobles… y obviamente queríamos mantener al usuario informado del estado en que el proceso Batch que estaba procesando sus datos se encontraba. Me imagino lo que estáis pensando… bueno quizás lo que pensaba yo… Sabemos que a veces es un poco “doloroso” trabajar con procesos batch, por una serie de razones: tiempo de procesamiento,  solapamiento de procesos que pueden usar los mismos registros,  mantener al usuario informado cuando los resultados deben de mostrarse en UI,  como mantener una traza de los registros procesados y creados en el Batch Job…. En este post voy a intentar dar una solución al solapamiento de procesos que usen mismos registros y tienen como resultado otros diferentes, y además una forma de mantener al usuario informado de los registros a procesar y ya procesados. Como os habréis dado cuenta esta es la primera parte, en la segunda parte tratare de dar una solución para trazar los registros procesados y recuperación en caso de que ocurran problemas en dicho procesamiento. Una serie aburrida sobre procesos batch!! 😛 Para ello tengo dos objetos:

  •  Batch Control :  Usaré este objeto para mantener a mi usuario informado del estado del proceso batch, si esta en cola si se esta procesando y  lo mas importante de los registros procesados y los registros a procesar
  • Batch Record Tracking : Este objeto lo usare para guardar la traza de aquellos registros que están siendo procesados por el proceso batch para no permitir que otros usuarios los usen, o el mismo usuario.  El caso que describiré aquí es el caso simple de bloqueo de concurrencia de registros entre procesos batch, pero tú quizás podrías extenderlo a : Bloqueo de registros por un criterio determinado , no solamente a  usuarios, solamente tendrías que modificar el objeto y quizás añadir un trigger.
  • Record Processed in Batch: Este objeto me dirá exactamente que objeto esta siendo procesado , tiene una relación master-detail a Batch Record Tracking , lo cual me permitirá el borrado de forma mucho mas sencilla.

Una cosita a tener en cuenta, es que los registros de estos objetos serán borrados una vez que el proceso batch termine para liberar espacio. Cómo son estos objetos? Pues muy bonitos, con sus campos , sus etiquetas …  aquí os dejo una fotito: Screenshot 2014-03-31 23.11.54 Aparece un objeto más, éste es el que se va a procesar en el batch job. Luego vamos a ver que tienen estos objetos:

  • Batch Control:

                     Batch Class: campo de texto que contendrá el nombre de la clase batch que contiene el código para el proceso batch. Batch Id: Campo de texto, de 18 caracteres , único y que diferencia entre mayúsculas y minúsculas. Representara el Id correspondiente al proceso batch el cual esta en ejecución en este momento. Error: es un campo de texto para guardar los errores que puedan ocurrir. Sin embargo se podría extender a otro objeto y creando una relación master-detail con Batch Control. Records Already Processed : este campo será usado para mostrar al usuario cuantos registros han sido procesados ya.

  • Batch Record Tracking:

Batch Class: campo de texto que contendrá el nombre de la clase batch que contiene el código para el proceso batch. Batch Id: Campo de texto, de 18 caracteres , único y que diferencia entre mayúsculas y minúsculas. Representara el Id correspondiente al proceso batch el cual esta en ejecución en este momento. Records Processed: Roll- up que ira contando los registros que están y han sido procesados. A esta altura seguramente te estarás preguntando, ¡¿Estos dos objetos son muy parecidos?!… vale es más bien una afirmación. Tienes toda la razón, son muy parecidos casi iguales, sin embargo he creado diferentes objetos ya que para el borrado es mas fácil.  ¿Por qué? Ya que Salesforce recomienda no tener relaciones master-detail con mas de 50K registros, puede que se necesite crear mas de un registro del mismo tipo que contendrá a los hijos, si es así recuerda Quitar el “único” del campo Batch Id.

  • Record Processed In Batch:

Batch RecordTracking: Master – Detail a Batch Record Tracking MyTestObject / Project: es un Lookup al objeto que se procesa en el batch, para poder navegar directamente a él. Processed Record Id: campo de texto el que representara  al id del objeto procesado ( no es una buena opción usar campos de texto para representar Ids , pero sin embargo si quieres hacer el seguimiento de mas de 25 tipos de objetos diferentes deberás usarlo) Y ahora la clase!


public with sharing class MyBatchClass implements Database.Batchable, Database.Stateful
{

    private BatchControl__c m_batchControl ;
    private BatchRecordTracking__c m_batchRecordsTracking;
    private MyNewTestObject__c m_myNewTestobject;
    private Id m_batchId;

    public Integer BATCHSIZE = 200 ; // you can always make it dynamic using a custom setting? 

    public MyBatchClass()
    {

    }

    public Id run()
    {

      // If you like to do some validations
      // or any previous prep for batch
      /// remember try - catch 😉
      return database.executeBatch(new MyBatchClass(), BATCHSIZE);

      }

      public Database.QueryLocator start(Database.BatchableContext batchableContext)
      {
         //initialize batch id to use it later
         m_batchId = batchableContext.getJobId();

         //PLEASE NOTE THAT THE QUERY IS SO GENERIC ONLY FOR PROTOTYPING -- YOU'LL HAVE A MORE RESTRICTING ONE
         String query = 'SELECT Id, Name FROM MyTestObject__c' ;
         return Database.getQueryLocator(query );
      }

      public void execute(Database.BatchableContext batchableContext, List<MyTestObject__c> scope)
      {

         SObjectUnitOfWork uow = new SObjectUnitOfWork( new List{ BatchControl__c.SObjectType, BatchRecordTracking__c.SObjectType, RecordCreatedfromBatch__c.SObjectType, RecordProcessedInBatch__c.SObjectType, MyNewTestObject__c.SObjectType, MyNewTestObjectDetail__c.SObjectType } );

         try
         {
            //record for Batch Control
            //query to AsyncApexJob to get the number of batches and get an aproximation of records to process
            List aaj = [Select Id, TotalJobItems from AsyncApexJob where Id=:m_batchId];
            //Obviously if we are here the batchId exists and the list will have an item --- BUT PLEASE CHECKIT !!
            //if(aaj!=null && !aaj.isEmpty())

            if(m_batchControl== null && m_batchRecordsTracking == null)
            {
                //now we can calculate the aprox
                Integer aproxRecordsToProcess = Integer.valueOf(aaj[0].TotalJobItems)* BATCHSIZE;
                m_batchControl = new BatchControl__c( BatchClass__c= 'MyBatchClass',BatchId__c=batchableContext.getJobId() , BatchStatus__c='Processing', RecordsAlreadyProcess__c=0,TotalRecordstoProcess__c=aproxRecordsToProcess);
                uow.registerNew(m_batchControl);

                // in part 2 of this post the object BatchRecordTracking will be linked to BatchControl
                m_batchRecordsTracking = new BatchRecordTracking__c(BatchClass__c= 'MyBatchClass',BatchId__c=m_batchId);
                uow.registerNew(m_batchRecordsTracking);
                uow.commitWork();
            }

            // Now I CREATE LINES FOR THE RECORDS THAT WILL BE PROCESS THIS WAY THEY WILL BE LOCK FOR OTHER BATCHS
            // OR FOR OTHER USERS --- YOU CAN MAKE THIS DEPENDENT ON A CRITERIA
            List<RecordProcessedInBatch__c> recordsWillBeProcessed = new List<RecordProcessedInBatch__c>();
            for(MyTestObject__c mto : scope)
            {
                RecordProcessedInBatch__c rpb = new RecordProcessedInBatch__c(BatchRecordTracking__c=m_batchRecordsTracking.Id,ProcessedRecordId__c =mto.Id, MyTestObject__c= mto.Id); // if you want more than 25 objects you will need to use text field to save the id
                recordsWillBeProcessed.add(rpb);
            }
            //if(!recordsWillBeProcessed.isEmpty())
            List saveResults = Database.insert(recordsWillBeProcessed,false);//--> this will insert only the ones that don't cause failure
            // because ProcessedRecordId__c is unique
            //if you would like all or none -->Database.insert(recordsWillBeProcessed,true);

             /*****************************************************
             Here is where the code for the batch goes.
             The records to be processed will be that ones that were inserted using Database.insert
             The records that will be excluded will be the ones that were not inserted

             How to check which ones where inserted properly?
             You can go throw the list records and check if they have id or no, if they don't have id it means they were not inserted.

             Note: Assuming that the records that were not inserted failed because the id was duplicated, if no the error should be check just in case 🙂
             *****************************************************/

             SObjectUnitOfWork uow2 = new SObjectUnitOfWork( new List{ BatchControl__c.SObjectType, MyNewTestObject__c.SObjectType } );

             if(m_myNewTestobject==null)
             {
                 //it is the master object that will contain the result objects
                 m_myNewTestobject = new MyNewTestObject__c(Status__c='Generating'); // --> this is my transaction Master object
                 uow2.registerNew(m_myNewTestobject);
             }

             /*********
             Once all the process is done, the main record is updated --- BATCH CONTROL
             **********/
            // we update the record with the number of records that have been processed here
            m_batchControl.RecordsAlreadyProcess__c = Integer.valueOf(m_batchControl.RecordsAlreadyProcess__c)+scope.size();
            uow2.registerDirty(m_batchControl); 

            uow2.commitWork();

       }
       catch(Exception e)
       {
           /****************************
           Any of the code the needs to be added to inform about the exception
           *****************************/

          //if there is any errors the New Object that is the result of the batch is set in error status
          if(m_batchControl==null)
          {
              m_batchControl = new BatchControl__c( Error__c = 'There is an error: '+ e, BatchClass__c= 'MyBatchClass',BatchId__c=batchableContext.getJobId() , BatchStatus__c='Failed', RecordsAlreadyProcess__c=0,TotalRecordstoProcess__c=0);
              uow.registerNew(m_batchControl);

              uow.commitWork();
          }
          else
          {
              // the batch control table is updated
              m_batchControl.BatchStatus__c= 'Failed';
              m_batchControl.Error__c= 'There is an error: '+ e;
              uow.registerDirty(m_batchControl);
           }
           if(m_myNewTestobject== null)
           {
              m_myNewTestobject = new MyNewTestObject__c(Status__c='Error', Error__c= 'There is an error in the "execute": '+ e); // --> this is my transaction Master object
              uow.registerNew(m_myNewTestobject);
           }
           else
           {
              m_myNewTestobject.Error__c= 'There is an error in the "execute": '+ e;
              m_myNewTestobject.Status__c='Error';
              uow.registerDirty(m_myNewTestobject);
           }

           /****************
           the batch record tracking is deleted in order to get the space back
           WHY IS IT DELETED??
           IT IS ONLY AN OPTION, YOU CAN ALWAYS KEEP IT AND RE-USE IN ORDER TO DONT PROCESS AGAIN THOSE RECORDS THAT WERE CORRECT...
           HOWEVER THIS CODE WILL DELETE THEM AND ALLOW THE USER TO REVIEW THE ERROR FIELD AND DELETE THE RESULT OR KEEP IT 

           --- >> NOTE THAT THE DELETE WILL DELETE 10K RECORDS IF YOU NEED MORE YOU WILL NEED TO CREATE THE WAY TO DO IT
           AT THIS MOMENT THE PROTOTYPE USE MASTER -DETAIL THEREFORE WILL BE EASIER TO DELETE BUT
           REMEMBER THAT SALESFORCE DON'T RECOMEND TO HAVE MORE THAN 50K CHILDS , THEN SHOULD BE GOOD TO CREATE MORE MASTERS IF YOU NEED IT
           *****************/
           uow.registerDeleted(m_batchRecordsTracking);

           uow.commitWork();

       }
       finally
       {
          // you can add here all that you would like to set or check
          // THIS CODE WILL BE ALWAYS EXECUTED!! EVEN WHEN THE JOB IS ABORTED
       }

   }

   public void finish(Database.BatchableContext batchableContext)
   { 

       SObjectUnitOfWork uow = new SObjectUnitOfWork( new List{ BatchControl__c.SObjectType, BatchRecordTracking__c.SObjectType ,MyNewTestObject__c.SObjectType } );
       try
       {
          /********************************
          Any code will be here
          *********************************/

       if(m_batchControl!=null)
       {

          //IF WE ARE HERE THIS IS THE LAST TO DO, THEN LET'S UPDATE THE RECORDS TO THE CORRECT STATUS
          m_myNewTestobject.Status__c= 'Completed';
          uow.registerDirty(m_myNewTestobject);
          m_batchControl.BatchStatus__c= 'Completed';
          uow.registerDirty(m_batchControl);

          // I dont need any more the tracking records , then let's get the space again
          uow.registerDeleted(m_batchRecordsTracking);

          /**********IMPORTANT***********
          ALL RECORDS SHOULD BE DELETED BECAUSE THE BATCH IS FINISH SUCCESSFULLY, THEREFORE THE USER WON'T NEED THEM ANY MORE.
          AT THE MOMENT THEY ARE NOT DELETED ONLY FOR REPORTING PUPOSES
          ******************************/
        }

     }
     catch(Exception e)
     {
     if(m_batchControl!=null)
     {

       //if there is any errors the New Object that is the result of the batch is set in error status
       m_myNewTestobject.Error__c= 'There is an error in the "finish" : '+ e;
       m_myNewTestobject.Status__c='Error';
       uow.registerDirty(m_myNewTestobject);
       // the batch control table is updated
       m_batchControl.BatchStatus__c= 'Failed';
       m_batchControl.Error__c= 'There is an error in the "finish": '+ e;
       uow.registerDirty(m_batchControl);

      /*******************************
      the batch record tracking is deleted in order to get the space back
      WHY IS IT DELETED??
      IT IS ONLY AN OPTION, YOU CAN ALWAYS KEEP IT AND RE-USE IN ORDER TO DONT PROCESS AGAIN THOSE RECORDS THAT WERE CORRECT...
      HOWEVER THIS CODE WILL DELETE THEM AND ALLOW THE USER TO REVIEW THE ERROR FIELD AND DELETE THE RESULT OR KEEP IT
      --- >> NOTE THAT THE DELETE WILL DELETE 10K RECORDS IF YOU NEED MORE YOU WILL NEED TO CREATE THE WAY TO DO IT
      AT THIS MOMENT THE PROTOTYPE USE MASTER -DETAIL THEREFORE WILL BE EASIER TO DELETE BUT
      REMEMBER THAT SALESFORCE DON'T RECOMEND TO HAVE MORE THAN 50K CHILDS , THEN SHOULD BE GOOD TO CREATE MORE MASTERS IF YOU NEED IT
      *******************************/

      uow.registerDeleted(m_batchRecordsTracking);

      uow.commitWork();
    }
   }
   finally
   {

     // you can add here all that you would like to set or check
     // THIS CODE WILL BE ALWAYS EXECUTED!! EVEN WHEN THE JOB IS ABORTED
   }
  }

}
Cómo funciona?
Integer aproxRecordsToProcess = Integer.valueOf(aaj[0].TotalJobItems)* BATCHSIZE;

m_batchControl = new BatchControl__c( BatchClass__c= 'MyBatchClass',BatchId__c=batchableContext.getJobId() , BatchStatus__c='Processing', RecordsAlreadyProcess__c=0,TotalRecordstoProcess__c=aproxRecordsToProcess);

uow.registerNew(m_batchControl);

// in part 2 of this post the object BatchRecordTracking will be linked to BatchControl

m_batchRecordsTracking = new BatchRecordTracking__c(BatchClass__c= 'MyBatchClass',BatchId__c=m_batchId);

uow.registerNew(m_batchRecordsTracking);

uow.commitWork();

Lo primero que hago justo al entrar en la parte del Execute es crear dos registros. Un registro para BatchControl el cual iré actualizando con los registros procesados o errores en su caso. El otro registro será el “padre” de todos los registros que se crearan mas delante de tipo RecordProcessedInBatch. Ten en cuenta que por ahora solamente se crea un padre si deseas crear más , deberás cambiar un poquito el código J Lo segundo y más importante es crear los registros que son usados para bloquear a otros usuarios de procesarlos a la vez y crear datos duplicados o incorrectos en base de datos.

List<RecordProcessedInBatch__c> recordsWillBeProcessed = new List<RecordProcessedInBatch__c>();

for(MyTestObject__c mto : scope)

{

    RecordProcessedInBatch__c rpb = new RecordProcessedInBatch__c(BatchRecordTracking__c=m_batchRecordsTracking.Id,ProcessedRecordId__c =mto.Id, MyTestObject__c= mto.Id); // if you want more than 25 objects you will need to use text field to save the id

    recordsWillBeProcessed.add(rpb);

}

Database.insert(recordsWillBeProcessed,false);

Te estas preguntando por que no uso en esta parte la clase UnitOfWork verdad? Pues resulta que el “truco” esta en usar .insert(list, false), ya que si algún registro falla todos los demás serán creados. ¿Por qué? Deberán de fallar si hay algún otro registro que esté asociado con el mismo record que se desea procesar. Sin embargo no fallará con aquellos registros que no están siendo procesados, y son con los que realmente podemos trabajar. Y al final de cada Execute actualizaremos el registro creado para Batch Control. En cada update insertaremos el total de registros que han sido procesados.

m_batchControl.RecordsAlreadyProcess__c = Integer.valueOf(m_batchControl.RecordsAlreadyProcess__c)+scope.size();

uow2.registerDirty(m_batchControl);

La siguiente pregunta sería pensar, ¿qué pasará si un error ocurre? Si ocurriese un error los registros resultantes, los nuevos registros creados en el proceso batch, se quedaran en estado “Error” nunca pasarán a “Complete” . Ten en cuenta que se usará un registro como padre ( en el código será m_myNewTestObject ) y todos los demás se le añadirán como hijos, para que de esa manera con esta arquitectura podamos seguir y notificar de mejor manera al usuario si algo ocurre. De igual manera el registro de BatchControl__c será actualizado al estado de Error y se rellenara el campo erro con el dicho.

m_batchControl.BatchStatus__c= 'Failed';

m_batchControl.Error__c= 'There is an error: '+ e;

uow.registerDirty(m_batchControl);

m_myNewTestobject.Error__c= 'There is an error in the "execute": '+ e;

m_myNewTestobject.Status__c='Error';

uow.registerDirty(m_myNewTestobject);

Y no se borrara nada , se le deja la opción al usuario ( o al desarrollador ) Al final del proceso, en la parte Finish, lo que estoy haciendo es actualizar de nuevo el registro de BatchControl__c , y borrar todo lo demás, aunque claro solamente lo guardo para hacer reports. Realmente si todo va bien debería ser borrado y así liberar el espacio. Nota: voy a intentar poner todo el código en un repositorio publico de git lo antes posible. Recursos: financialforcedev/ fflib-apex-common Database class

Salesforce Essentials Madrid. Conociendo a la comunidad Salesforce Española

Como dice la canción.. “Nos vamos pa Madrid”  … y nos fuimos, al Evento Salesforce Essentials.

El pasado día 6 de Marzo asistí a mi primer evento Salesforce en Español.

Como podréis imaginar para mi era toda una novedad, no por ser solamente un evento Salesforce sino que también por ser en español. He tenido la oportunidad de asistir al evento Salesforce en Londres que se hizo en el año 2012, y tuve la gran oportunidad de asistir a Dreamforce 13 el pasado Noviembre , pero como sabéis ambos eventos eran en Inglés.

Pues bien ahí estaba el momento de ir por fin a un acontecimiento Salesforce español conocer a la comunidad  Salesforce española.  Pensaba que dicho evento no sería muy popular ya que en España la plataforma Salesforce se esta dando a conocer ahora, pocas empresas trabajan con Salesforce, pocas empresas conocen la plataforma…. Pero estamos cambiando!

Ciertamente me alegro de haber asistido porque mi sorpresa fue muy grata. Salesforce está creciendo!!

¿Por qué decidí ir?  Siendo desarrollador en la plataforma Salesforce y siendo española realmente me interesaba saber como se ve dicha plataforma allí. Conociendo el estado económico de España me gustaría saber que empresas están apostando en mi país por algo que personalmente considero una gran oportunidad de futuro.  Quería conocer a la comunidad española que trabaja como yo , quería saber sus opiniones, quería también decir dar a conocer mi opinión y decir que trabajo en una compañía que apuesta por España y que esta totalmente basada en la plataforma Salesforce, FinancialForce.com . Que gran oportunidad era esa!

Y realmente lo fue!

Pues bien, tras un largo viaje el día anterior, alrededor de unas 10 horas para llegar a Madrid desde Harrogate , no importó ese tiempo, el día de después  6 de Marzo pagó con creces el esfuerzo.

Me reuní en Madrid con mi compañera Agustina que ciertamente cuando le comenté que iba al evento no dudó por un segundo en unirse.  Y allí estábamos la mañana del 6 dando nuestros datos en el registro para recoger nuestro pase.Que por cierto se me pasó comprobar mis datos y al principio de mañana me podías llamar C2G … seguro que entiendes el porque cuando haces paquetes y necesitas namespaces!

BiB6gTtIMAA7GAG  20140316_152410

2014-03-06 08.00.12

 Lo primero que vi al entrar fue el Stand de Aborda, ahora te puedes preguntar quienes son / que es Aborda? ( Aquí te dejo el link para que tengas más información: Aborda url ) Aborda es una compañía cloud, partner Platinum de Salesforce . Tuve la oportunidad de conocer ese día a Alejandro  García Ruiz, Salesforce Technical Consultant el cual nos dío una sesión sobre  uso JavaScript Remoting y VF pages  en Salesforce 1, y con el que tuve la oportunidad de intercambiar opiniones sobre ser Consultor de Salesforce.  También tuve la suerte de conocer a Miguel Ángel Sánchez , CEO de Aborda el cual compartió su visión de futuro de Salesforce , no solamente su visión de futuro si no como Aborda empezó en España hace ya 12 años. Realmente inspirador el apostar por dicha plataforma en aquellos tiempos y en un país que no estaba a la orden del día Force.com.  Y como digo la oportunidad de compartir con el visiones como la nuestra en FinancialForce y la suya en Aborda.

Tras ver el Stand de Aborda estuve por la zona de networking donde por fin tuve el placer de conocer a Jose Luis Almazán, con el cual ya había hablado a través de la comunidad, brillante desarrollador Salesforce senior y que ahora es parte de ticMind, cofundador de ticMind ,  Consultoría Salesforce CRM y Force.com en España( otro link para que le echéis un vistazo : ticMind url ), y el que nos introdujo a algunos de los miembros de  la familia ticMind como Susana e Ivan. Realmente grandes profesionales y muy agradables personas. Y como era de esperar con José Luis tuve una gran conversación sobre JavaScript Remoting y el mundo de hacer paquetes en Salesforce. ( Que por cierto Jose Luis tenemos que re contactar tengo noticias sobre este último tema J )

Después de hablar obviamente necesitábamos tomar algo con lo que fuimos a tomar algo y allí encontré a Federico Foglia, brillante desarrollador Senior que tuve el placer the conocer en el grupo de desarrolladores Salesforce de Londres y que como yo trabaja en Inglaterra,  él también estaba allí en Salesforce Essentials Madrid apostando por la plataforma en España y él que nos introdujo a Sergio y Aaron dos jóvenes emprendedores y bastante profesionales que son  fundadores de Clapps ( de nuevo aquí tenéis  el link : Clapps url)

Pero ahí no acabo la cosa, en las sesiones de la  tarde ahora ya en la Dev Zone, donde ya me encontraba mas relajada, ya sabéis zona de desarrolladores para mi es mas  .. como decirlo en mi salsa 🙂

Llegue a la zona de desarrolladores que se abría justo después del almuerzo y otra sorpresa, la sala estaba llena! Aunque tuve suerte había asientos en primera fila. Luego allí estaba de nuevo en primera fila expectante a la sesión en la cual se habló de Salesforce1 y en la cual pude ver de nuevo un breve apunte a la app que desarrollamos para la reléase de Salesforce1 el pasado Noviembre.

2014-03-06 12.51.16  2014-03-06 12.33.55   2014-03-06 13.10.01

Genial! Introccion a Salesforce 1 a mano de Eduardo y Fernando, ambos parte de la familia Salesforce y con los que tuve el placer de hablar. Grandes profesionales. Realmente feliz de haber podido charlar con ellos sobre la visión de Salesforce en España y de aquí gracias a Eduardo por introducirme a Huber Cotter RVP Platform Southern Europe at salesforce.com, el cual también estaba entusiasmado por la acogida de la gente al evento Salesforce Essentials.

Y tras las sesiones asistir al hackaton donde pude hablar con Ignacio Saenz que también forma parte de la famila Salesforce Spain, y estaba organizando el Hackaton, donde pude hablar con los otros desarrolladores, compartir conocimientos, entender nuevas visiones todos ellos un gran grupo donde había grandes ideas , realmente disfruté esa parte.

Luego en resumen pude asistir a mi primer Keynote  en español donde se introdujo Salesforce 1 a la comunidad española, intercambiar opiniones sobre esta con desarrolladores, consultores y clientes de la plataforma.  Conocer más sobre Salesforce en España, entender un poco mejor el futuro de Salesforce en nuestro país,  compartir mis ideas y opiniones. Y por supuesto conocer a parte de esa comunidad de Salesforce Española!! . Que crece y crece, que ojalá el próximo año tenga de nuevo la oportunidad de asistir y conocer a aquellos que no pude este año como Ricardo Ramirez o como Jose Blanco con los que me hubiese encantado tener una conversación sobre formas de desarrollo en la plataforma, evolución de esta y como ven Salesforce1. Pero me lo anoto y ojalá en la próxima ocasión tenga la oportunidad de ello . Y como seguro muchos más que se unirán al desarrollo en Salesforce! Crecemos!

 Muchas gracias por Salesforce Essentials! Espero más y mejor el próximo año… y que sigáis poniendo futbolines en la zona de networking  🙂

                20140316_151324   20140316_151334

LO BUSCAS? LO TENGO! – Salesforce1 && Communities

You search it, I have it!

Imagina que estás en casa y el grifo de la cocina empieza a gotear … no consigues arreglarlo y ahora tienes que buscar a alguien que venga a arreglarlo!!

Pero no conoces a nadie, tienes que llamar a todos tus amigos, empezar a buscar en internet …. Y cuando quizás encuentras al profesional que te puede ayudar,  cómo puedes saber que hará un buen trabajo??!!!

Imagina que estás en casa, no te apetece cocinar… buscas en el típico cajón el papelito del chino habitual que realmente no te gusta mucho pero no conoces muchos otros, y no sabes que han abierto uno nuevo justo al final de tu calle!!

Cuantas aplicaciones necesitas? Cuantas paginas web tienes que consultar para obtener una respuesta?

Para encontrar un restaurante , necesitas instalar una aplicación,  o buscar diferentes sitios de internet. De igual forma pasa si necesitas un servicio o un hotel…

Que te parecería ser parte de una comunidad y teniendo en una sola aplicación todo!

Tenlo todo en una sola aplicación: Salesforce1

Comunidades y Salesforce1 pueden hacerlo posible:

Lo buscas? Lo tengo!

Como hacerlo?

Muy simple, he intentado usar “Point- Click – Enhace” todo lo posible. Es decir me he mantenido “Native” en todo lo posible, usando en mayor medida funcionalidad existente de Salesforce y he añadido muy poquito código. Que realmente podría haber omitido en algunas partes pero también quería usar para la muestra los patrones de diseño provenientes de Andy Fawcett (@andyinthecloud)  y Stephen Willcock (@stephenwillcock). Una pequeña mezcla de versiones.

(Échale un vistazo a este link para mas información, seguro que te gusta : financialforcedev/ fflib-apex-common)

En mi prototipo he creado una serie de objetos dentro de una organización. Estos objetos me ayudaran a manejar Proveedores de servicios, Restarantes, Pedir Presupuestos, Presupuestos, Pedidos , Revisiones a Servicios y pagos entres los usuarios.

También he usado Flexipages ( la gema oculta de Salesforce1… por ahora, espero que pronto pongan una UI para creación) , que me distribuyen todos los registros relacionados entre si en diferentes Apps.

Por ejemplo una Flexipage Tab es Servicios, la encontras solamente en mobile (intentare crear un post para explicar un poquito mas sobre Flexipages, mientras tanto quizás esta respuesta te ayude un poco a entenderlas un poquito mejor: salesforce.stackexchange)

Dentro de dicha Flexipage Tab,Servicios, lo que podrás encontrar son listas de: Proveedores de servicios, Listas de Cuotas, Listas de pedidos , Calificaciones para Servicios …

Dentro de otra Flexipage Tab, Restaurantes, lo que encontraras será una lista de Restaurantes, Listas de pedidos a dichos restaurantes…

Dentro de otra Flexipage Tab, Hoteles, lo que encontraras será una lista de Hoteles, Lista de Reservas…

¿Cómo se usaría?

Desde Mobile y desde web browser sería accesible. Solamente necesitaras Salesforce1 en tu móvil, para browser simplemente registrarte dentro de la comunidad.

¿Quién usaría  esta comunidad?

Tanto el proveedor del servicio para publicar su Servicio , Compañía o Restaurante u Hotel… tanto como el usuario que busca dicho servicio, para comparar servicios , para hacer un pedido de comida, para reservar un hotel, para preguntar una cuota ..

¿Cómo usar la comunidad y la aplicación?

Para ello voy a poner un ejemplo que ayudará a entenderla mejor.

Tengo dos personas en mi ejemplo: una es Pepe el Cerrajero del Barrio y el otra es José nuevo en el barrio, justo se trasladó con su familia a su nueva casita.

Pepe, es un Fontanero muy moderno sus hijas le mantienen a la última en tecnología y tiene un iPhone, en el cual le descargaron la aplicación Salesforce1.

José conoce Salesforce1 y también Salesforce y es miembro de la comunidad de : Lo buscas? Lo tengo!

El primer día en casa y uno de las puertas de la casa no cierra bien, la llave se quedo dentro de la cerradura y no pueden cerrarla. Justo se mudaron y el primer día en casa su familia no estará a salvo! ( bueno es un decir el nuevo barrio es muy tranquilo).

Resulta que unos días antes Pepe entro en la comunidad y registro su servicio:

Desde su móvil hizo click en la acción global : Service Provider ( No te preocupes se verá también en Español , Salesforce lo hace por me, lo “Translate” todo! )

Crea su servicio : Cerrajerías Pepe. Abre y cierra todo lo que esté a su alcance S.L

2014-03-09 20.51.57  Screenshot_2014-03-09-21-24-51  2014-03-09 21.21.05

Los antiguos clientes de Pepe se dieron cuenta que al fin puso su negocio en internet y entraron para revisarlo. Parece que Pepe es bueno en su trabajo tiene una calificación del 92.5%.

2014-03-09 21.21.30

Volviendo a José, el cual necesita un cerrajero urgentemente, pide un presupuesto a Pepe. Solamente desde el servicio hace click en la Chatter Action: Request Quote.

2014-03-09 20.51.57  Screenshot_2014-03-09-21-36-43   Screenshot_2014-03-09-21-39-24

Al momento el móvil de Pepe le avisa mediante una notificación que alguien quiere un presupuesto urgente para cambiar la cerradura de una puerta.

2014-03-09 21.43.51 2014-03-09 21.43.40

Pepe desde la petición de cuota hace click en la Chatter Action asociada: Send Quote, y Evualá! La cuota se ha mandado, la petición de cuota se ha actualizado a enviada y José recibirá al momento una notificación con dicha cuota.

2014-03-09 21.44.00  2014-03-09 21.44.04 2014-03-09 21.44.58

José abre su notificación, desde su notificación se mueve a la quota y Hurra! Le gusta le parece aceptable, además Pepe le ha puesto que puede ir en 20 minutos si acepta la quota. Dicho y hecho, José se va a la acción relacionada con quota: Accept Quote, entra, Acepta la cuota y listo.

Screenshot_2014-03-09-21-45-31  Screenshot_2014-03-09-21-45-54  Screenshot_2014-03-09-21-46-08

Al instante Pepe recibe la notificación  que le comunica que su cuota se ha aceptado y tiene un nuevo trabajo que hacer.

2014-03-09 21.47.14  2014-03-09 21.47.53

Desde el pedido/ Order se va a la acción: Actualizar Pedido (Update order) y  actualiza el estado a “Trabajando”, modifica el campo “Detalles” para comunicar a José que se pone en camino.

2014-03-09 21.48.14  2014-03-09 21.48.38

José, recibe la notificación que le indica que su pedido se ha modificado. Llendo al pedido desde la notificacioón José puede ver que Pepe se encuentra en camino.

Screenshot_2014-03-09-23-43-37

Al terminar de arreglar la cerradura Pepe actualiza el pedido a terminado

2014-03-09 21.48.14  2014-03-09 23.45.26

y a José se le crean dos “Tasks” una para realizar el pago a Pepe y otra para calificar el servicio recibido.

Screenshot_2014-03-09-22-02-56

IMPORTANTE, a tener en cuenta: Lo que ves es solamente un prototipo, una idea para mostrar que podriamos hacer con Salesforce1 y comunidades. Luego Lo Buscas Lo Tengo no esta funcionando como tal… pero quién sabe si en un futuro??!!

En estos momentos “Communities” no esta listo para Salesforce1, Winter ’14. Sin embargo las noticias son que en Spring ’14 Comunidades estarán disponibles. Estoy pasando todo mi desarrollo a una nueva organización pre-release Spring 14 y aparentemente esta funcionando. Tengo algunos problemillas con Global Chatter Actions y pequeñas cosillas que me imagino estarán en proceso. Puede que próximamente haga publica la communidad! 🙂

Por ahora nada más, intentaré actualizar con lo que vaya apareciendo y quizás como ya digo hacer pública la comunidad 🙂

Espero que te haya gustado la idea! Nos vemos pronto!

Links que te pueden ayudar  para escribir y estructurar el código de la aplicación . Los cuales he usado en esta implementación. Solamente he escrito triggers, no he necesitado nada más, y en triggers lo que hecho ha sido mandar notificaciones y hacer una serie de validaciones. Minima cantidad de código.

Apex Enterprise Patterns: Building Strong Foundations

Apex Enterprise Patterns – Separation of Concerns

Apex Enterprise Patterns – Service Layer

Apex Enterprise Patterns – Domain Layer

Apex Enterprise Patterns – Selector Layer

Mi experiencia “Dreamforce ’13”. Cruzo el charco!

Una palabra para describirlo : AWESOME!! INCREIBLE!!

Desde el momento que todo empezó como una conversación en un pub inglés con mi amigo Paul, hablando como siempre de nuestro mono-tema Salesforce,  hasta que me vi en América , todo ese tiempo fue una experiencia asombrosa.

La verdad es que  hablando sobre los retos diarios en el trabajo, cómo podríamos mejorar nuestro día a día quizás en ese momento es entonces que se encendió la bombilla de la idea y dijimos por qué no?!! vamos a intentarlo, vamos a enviar la idea a Dreamforce y ver si conseguimos que nos acepten… y unos cuantos meses después … Nos aceptaron!!

Pero no solo eso, en mi empresa tuve una conversación con mi Manager en ese momento, en el que me comunicó que iba a trabajar en el proyecto Salesforce1!! Que iba a tener la posibilidad de trabajar con la versión beta de Salesforce1 y que además me querían esponsorizar-patrocinar para ir a Dreamforce.  Ese momento fue alucinante!

Y cuando creía que no podía mejorar, quien es mi mentor en estos momentos y tengo el placer de trabajar con él día a día , Stephen Willcock , me preguntó que si me gustaría ser parte de la sesión que el también tenía, explicando como había usado Publisher Actions, para crear la pequeña app en Salesforce1 beta.

Luego me vi preparando 2 sesiones para Dreamforce, una con mi gran amigo Paul Batisson y otra con el hombre de grandes ideas Stephen, el cual apoya mis ideas ( bueno no todas , que algunas son muy locas 🙂 ) , pero sin olvidar que durante el tiempo que estuve trabajando en el proyecto relacionado con Salesforce1 tuve la oportunidad de trabajar mas directamente con Andy Fawcett.

De acuerdo, fue un tiempo un poco estresante, a contra reloj, intentando descubrir como Salesforce1 iba a funcionar, trabando largas horas, haciendo cambios de ultima hora , intentando tenerlo todo listo en conjunto con los cambios que Salesforce1 tenía diariamente pero era para Dreamforce! Luego fue algo genial!

Cuando creí que eso era todo, Mary Scotton, Developer Evangelist se pone en contacto conmigo para preguntarme si quiero formar parte de otra sesión junto a:  Andy Ognenoff,  Kevin O’Hara , Cory CowgillLeah McGowen-HareAyori Selassie y Cheril Porro

Como me podía negar?!!! De hecho aún a día de hoy le estoy muy agradecida por la oportunidad que me ofreció para contar mi historia.

Con lo que allí estaba yo, viajando a América por primera vez y dando 3 sesiones en Dreamforce 13 .

Pero claro puedes ahora estar pensando que Dreamforce no es para tanto… pues he de decirte que no es así! Dreamforce fue una de las mejores experiencias de mi vida.

Como desarrollador debo de decir que Dreamforce fue genial , me sentía como un niña pequeña en una tienda de golosinas! Sesiones sobre Salesforce por todos lados , un salón especifico para mostrar cómo es la posición femenina en este mundo tecnológico, demostraciones  al instante… Realmente era un no parar, no había sitio para el aburrimiento!

Genial! Fue Genial! Si tenéis la oportunidad de ir, no lo dudéis ni por un segundo!!

A continuación he incluido información sobre las tres sesiones en las que participé ( solamente una tiene grabacion de video) y también una entrevista que me hicieron el último día ( no os riáis mucho de mi acento :P)

Primera sesión con Paul Batisson  :

Behaviour Driven Development (BDD) With Apex on Force.com

How do you known you’re building the Force.com apps that business values the most? Behaviour Driven Development (BDD) has evolved to help developers create code that is self-documenting, has an automated test suite, and is open to change.

Behaviour Driven Development is a process that allows developers and business users to interact together in defining user features more clearly and concisely, leading to code that is self-documenting and easier to test for developers.

BDD has evolved out of established agile practices and is designed to make them more accessible and effective.  Here we will present a set of practices and processes a developer or development team can utilise in order to practice BDD on the Force.com platform with Apex as well as covering what BDD is and why you should utilise it within your code.
mybigculo   bdd1
Segunda sesión

Chatter Publisher Actions & Salesforce1 

Chatter Publisher Actions provide a new way of interacting with Salesforce applications, allowing users to take control of records and processes from within the Chatter feed. As a key component of Salesforce1, Publisher Actions are also inherently mobile. Join us as we demonstrate specific use cases, and code examples to help developers take advantage of this new feature of the Force.com platform.

Tercera Sesión :

Force.com Careers: How Do I Get There From Here?

Do you love developing on the Salesforce Platform, but wonder what the next steps are for your career? Join our panelists to hear about various career paths, including Consultant, Architect, Product Manager, and AppExchange Developer, to name a few. These experts will share the pros and cons of their careers and also the path to get there.
careers4 careersdf132 careersdf13