“Cannot insert duplicate key” cuando clonas una actividad

En más de un proyecto nos hemos visto obligados a tener que clonar/duplicar actividades. Un motivo que nos encontramos a menudo para hacer esto es que el campo Regarding (Referente a) está limitado a un solo registro, por ejemplo, un caso. Pero existen circunstancias en las que nos gustaría que un email -o culaquier otra actividad- se quedase como referente a más de un elemento, como podrían ser una sesión de USD y todos los casos creados en la misma sesión. Supongamos que un email de un cliente incluye varias incidencias. Cada una de ellas debería tratarse como un caso separado, con un SLA distinto, y también es posible que cada uno de los casos sea resuelto por un departamento distinto de la empresa. Para que en cada uno de los casos quede guardada toda la traza de emails/tareas en el panel de actividades nos vemos obligados a duplicarlos. Dejando el motivo un poco de lado, si nos vemos en la necesidad de duplicar una actividad, nos daremos cuenta que al intentar hacerlo con la SDK nos encontramos con el error “Cannot insert duplicate key”.

Un ejemplo de código que devuelve ese error sería el siguiente:

Al ejecutarlo obtenemos el error de clave duplicada:

Error "Cannot insert duplicate key" al crear actividad duplicada

Error “Cannot insert duplicate key” al crear actividad duplicada

 

El origen del error está en los campos de tipo PartyList que tienen todas las actividades en los campos “from”, “to”, “cc” y otros. Al intentar duplicar la actividad estamos duplicando también las referencias a estos campos, y nos encontramos con que estas referencias ya existen. Para ello solo tenemos que regenerar los IDs de los campos PartyList de la actividad origen, generando nuevos IDs para que no esté duplicados.

Para ello, antes de duplicar todos los campos en la actividad clonada pasamos un proceso de regeneración de IDs mediante la funcion RegenerateIdsActivityPartiesInActivity:

 

Con esto podremos completar la clonación correctamente.