sábado, 24 de febrero de 2018

Aceptación de condiciones con SharePoint

Esta semana me han pedido que al acceder a la página principal de un SharePoint saliera un recordatorio respecto a la normativa corporativa de la empresa. Querían que saliera todas las veces que accedían al portal.

Solución rápida: Un alert de JavaScript.

Como era de esperar a los tres días les ha parecido que no era una buena solución y que les parecía mejor la solución que les propuse inicialmente, que sólo saliera la primera vez que accedes al espacio y que quedase registrado cuando has dicho que estabas de acuerdo con los términos legales de la empresa.

Para ello, lo primero que he creado ha sido una lista llamada AceptaciónCondiciones. En ella, sólo utilizo la columna Título, Creado por y Creado. Todas ellas propias del tipo de contenido Elemento, propio de una lista personalizada.

Y en la página de inicio he incluido el siguiente script en un editor de secuencias de comando:
<script type="text/javascript">
 $( document ).ready(function(){
 var usuario = $().SPServices.SPGetCurrentUser({
  fieldNames: ["FirstName", "LastName", "UserName"],
  debug: false
 });
 $().SPServices({
    operation: "GetListItems",
    async: false,
    listName: "AceptacionCondiciones",
    CAMLViewFields: "<ViewFields><FieldRef Name='Title' /></ViewFields>",
CAMLQuery: "<Query><Where><Eq><FieldRef Name='Title'/><Value Type='Text'>"+usuario.UserName+"</Value></Eq></Where></Query>",
    completefunc: function (xData, Status) {
if($(xData.responseXML).SPFilterNode("z:row").length == 0){
//No está y lo incluyo
alert('Advertencia: Este acceso sólo está disponible para usuarios autorizados por personal del servicio. Cualquier intento de acceso no autorizado quedará registrado para su posterior análisis. La documentación aquí alojada es para uso profesional, no permitiéndose su divulgación. ');
AddListItem(usuario.UserName);
}    
    }
  });
})
function AddListItem(TitleField) {
        $().SPServices({
            operation: "UpdateListItems",
            async: false,
            batchCmd: "New",
            listName: "AceptacionCondiciones",
            valuepairs: [["Title", TitleField]],
            completefunc: function (xData, Status) {   
            }
        });
    }
</script>

Lo que hace este Script es guardar en una variable llamada "usuario" el Nombre, Apellido y Nombre de usuario. Luego hago una llamada a la lista AceptacionCondiciones a través de una Query de CALM preguntando si existe algún elemento que en la columna Title (Nombre interno de la columna Título) que contenga el valor de UserName del usuario de DA que esta accediendo a la página principal.
En caso de que no este, hago saltar un Alert de JavaScript con el texto deseado y tras ello incluyo en la lista el usuario, a través de la función AddListItem, completando el campo Titulo con el UserName y como los campos "Creado" y "Creado por" toman automáticamente el nombre a mostrar del usuario y el momento en que hemos aceptado las condiciones.

Ya tendríamos nuestra lista de aceptación de condiciones pedida.

Sí nos hubieran pedido que esta aceptación saliera en cualquier página de nuestro sitio, bastaría con incluir este Script en la página maestra e incluir la línea que indica donde esta la lista, por si estamos en un sitio diferente al de la lista:
webURL: "https://URL del sitio donde esta mi lista de Aceptación de condiciones",

Quedando algo como:
 $().SPServices({
    webURL: "https://URL del sitio donde esta mi lista de Aceptación de condiciones",
    operation: "GetListItems",
    async: false,

Y el resto igual.

Posiblemente con .Net se pudiera hacer algo más completo, pero seguro que también sería más costoso en tiempo.