30 de abril de 2018

:: Alfresco. Envío de un correo de notificación, haciendo uso de una plantilla personalizada

Sobre una carpeta en Alfresco definiremos una regla de contenido que tras subir algún documento a la misma, ejecute un script.

El contenido del script -almacenado en un fichero al que llamaremos: "notificaciones-personalizadas.js" - podría ser algo como esto:


var mail = actions.create("mail");

mail.parameters.from = "netic360@gmail.com";

//Lista de destinatarios separados por comas
mail.parameters.to = "netic360@gmail.com";

//Asunto del mensaje
mail.parameters.subject = "Notificación personalizada";

//Mapeo de variables utilizadas en la plantilla
var map = new Object();
map["firstName"] = person.properties["cm:firstName"];

//Ruta de la plantilla a utilizar
mail.parameters.template = companyhome.childByNamePath("/Diccionario de datos/Plantillas de correo electrónico/plantilla-personalizada.html.ftl");

//Asignación de las variables mapeadas a la plantilla
mail.parameters.template_model = map;
mail.parameters.text = "Cuerpo del mensaje en el caso de que no se encuentre la plantilla";

//Envío del correo
mail.execute(companyhome);



Por otro lado, la plantilla - que ubicaremos donde corresponda y que llamaremos: "plantilla-personalizada.html.ftl"- contendría el siguiente código:

<html>
    <head>
 </head>
    <body>
        Hola ${firstName},<br />
  <br/>
  Este es un correo personalizado.<br />
  <br />
  Un saludo
    </body>
</html>



Para probar el uso de esta plantilla, subiremos un documento a la carpeta que tiene establecida una regla de contenido que ejecutará nuestro script. Si todo es correcto, recibiremos -en la cuenta de correo especificada- el contenido definido en la plantilla.

23 de abril de 2018

:: Alfresco. Programación de tareas

Una prueba de concepto para comprobar el funcionamiento de las tareas programadas en Alfresco, podría ser: recibir un correo electrónico con los documentos (por ejemplo: contratos) que caducarán en un determinado periodo de tiempo.

Para esta prueba haremos uso del aspecto: "Efectividad" descrito en otro post.

Los pasos a seguir para crear la tarea programada son los siguientes:

.- Editamos el fichero que nos permite la definición de tareas programadas: scheduled-action-services-context.xml ubicado en la ruta: tomcat/shared/classes/alfresco/extension

.- Añadimos los detalles de la tarea programada, la cual ejecutará un script cada cierto tiempo


<bean class="org.alfresco.repo.action.scheduled.SimpleTemplateActionDefinition" id="runScriptAction">
  <property name="actionName">
   <value>script</value>
  </property>
  <property name="parameterTemplates">
  
   <map>
    <entry>
     <key>
      <value>script-ref</value>
     </key>
     <!-- Note that as of Alfresco 4.0, due to a  Spring upgrade, the FreeMarker ${foo} entries must be escaped -->
     <value>${selectSingleNode('workspace://SpacesStore', 'lucene', 'PATH:"/app:company_home/app:dictionary/app:scripts/cm:busqueda_lucene.js"' )}</value>
    </entry>
   </map>
  
  </property>
  <property name="templateActionModelFactory">
   <ref bean="templateActionModelFactory">
  </ref></property>
  <property name="dictionaryService">
   <ref bean="DictionaryService">
  </ref></property>
  <property name="actionService">
   <ref bean="ActionService">
  </ref></property>
  <property name="templateService">
   <ref bean="TemplateService">
  </ref></property>
 </bean>
 
 <bean class="org.alfresco.repo.action.scheduled.CronScheduledQueryBasedTemplateActionDefinition" id="runScript">
  <property name="transactionMode">
   <value>UNTIL_FIRST_FAILURE</value>
  </property>
  <property name="compensatingActionMode">
   <value>IGNORE</value>
  </property>
  <property name="searchService">
   <ref bean="SearchService">
  </ref></property>
  <property name="templateService">
   <ref bean="TemplateService">
  </ref></property>
  <property name="queryLanguage">
   <value>lucene</value>
  </property>
  <property name="stores">
   <list>
    <value>workspace://SpacesStore</value>
   </list>
  </property>
  <property name="queryTemplate">
   <value>PATH:"/app:company_home"</value>
  </property>
  <property name="cronExpression">
   <value>0/30 * * * * ?</value>
  </property>
  <property name="jobName">
   <value>jobC</value>
  </property>
  <property name="jobGroup">
   <value>jobGroupC</value>
  </property>
  <property name="triggerName">
   <value>triggerC</value>
  </property>
  <property name="triggerGroup">
   <value>triggerGroupC</value>
  </property>
  <property name="scheduler">
   <ref bean="schedulerFactory">
  </ref></property>
  <property name="actionService">
   <ref bean="ActionService">
  </ref></property>
  <property name="templateActionModelFactory">
   <ref bean="templateActionModelFactory">
  </ref></property>
  <property name="templateActionDefinition">
   <ref bean="runScriptAction">
  <!-- This is name of the action (bean) that gets run -->
  </ref></property>
  <property name="transactionService">
   <ref bean="TransactionService">
  </ref></property>
  <property name="runAsUser">
   <value>System</value>
  </property>
 </bean>

Como podemos ver, el script "busqueda_lucene.js" se ejecutará cada 30 segundos.
El contenido del script -almacenado en: "Repositorio" > "Diccionario de datos" > "Scripts" - podría ser algo similar a esto:


var nombredoc = document.properties["{http://www.alfresco.org/model/content/1.0}name"];
var hoy = new Date();
var dia = hoy.getDate();
var mes = hoy.getMonth()+1;
var anyo = hoy.getFullYear();
var siguiente = new Date();
siguiente.setMonth(siguiente.getMonth() + 1);
var dia_sig = siguiente.getDate();
var mes_sig = siguiente.getMonth()+1;
var anyo_sig = siguiente.getFullYear();
var finicio = anyo +"\-" + mes+ "\-" + dia + "T00:00:00.000Z";
var ffin = anyo_sig + "\-" + mes_sig + "\-" + dia_sig + "T23:59:59.000Z";
var query = "@cm\\:to:[" + finicio + " TO " + ffin +"]";
var documentos = search.luceneSearch(query);
var log = "";
for (var i=0; i < documentos.length(); i++)
{
   log += "Nombre: " + documentos[i].name + "\tRuta: " + documentos[i].displayPath + "\r\n";
}
var mail = actions.create("mail");
mail.parameters.html = "html";
mail.parameters.from = "asacinternet@gmail.com";
mail.parameters.to = "gis@asac.as";
mail.parameters.subject = "Alfresco :: Documentos que caducan mañana";
mail.parameters.text = "Consulta: " + query + " --- Listado: " + "\r\n" + log;
mail.execute(document);

16 de abril de 2018

:: Alfresco. Caducidad de los documentos

Un caso bastante habitual en las implantaciones de Alfresco consiste en gestionar la caducidad de los documentos. Por ejemplo, si necesitásemos conocer los contratos que han caducado un posible planteamiento podría ser algo similar a esto:
.- Para gestionar la caducidad de los documentos podemos hacer uso del aspecto: "Efectividad", el cual nos permite especificar una fecha de inicio y fin para el documento. De esta manera, en el detalle de un documento, seleccionaremos la opción: "Gestionar aspectos"

.- En la lista de aspectos disponibles, seleccionaremos el comentado anteriormente y lo añadiremos.


.- En las propiedades del documento, podemos establecer ahora una fecha de inicio y fin. Tras especificar las fechas necesarias, pulsaremos sobre el botón "Guardar"


.- Para conocer los documentos (contratos para el caso que nos ocupa) caducados, podemos hacer uso del dashlet: "Búsqueda guardada"
De esta manera lo añadiremos en la opción: "Personalización del panel de inicio"

.- Una vez añadido debemos configurarlo como corresponda, en este caso: "cm:to:[MIN to NOW]"

.- Una vez configurado, este dashlet nos mostrará los documentos cuya fecha: "Vigente hasta" sea inferior a la fecha actual






10 de abril de 2018

:: Wordpress. Creación de un tema

Los temas en wordpress se encuentran en la carpeta "wp-content/themes" donde existirá una carpeta por cada uno de los que estén disponibles para aplicar sobre nuestra web.

Para el caso que nos ocupa, crearemos una nueva carpeta en la ubicación anterior. Por ejemplo: "netic360".

Si accedemos al panel de administración de nuestro wordpress: "Apariencia>Temas", podremos ver nuestro nuevo tema, aunque aparecerá marcado como "Tema dañado" indicando que nos falta la hora de estilos.
En la carpeta que hemos creado: "netic360" añadiremos un fichero vacío, denominado: "style.css".
Si accedemos de nuevo al panel de nuestro Wordpress, en esta ocasión nos indicará que es necesario un fichero: "index.php" por lo que procedemos a crearlo.

Desde este momento, para Wordpress será un tema correcto, aunque no contenga nada.

Cada tema en Wordpress lleva asociada una metainformación que puede insertarse como comentarios en la parte superior del fichero: "style.css"

  • Theme Name
  • Theme URI
  • Author 
  • Author URI 
  • Description
  • Version 
  • License 
  • License URI 
  • Text Domain
  • Tags


Para esta información podemos guiarnos por otro tema creado previamente.

Por último necesitaríamos una captura de pantalla: "screenshot.png" que representa el aspecto que tendrá nuestro tema una vez aplicado

5 de abril de 2018

:: Adwords. Script alerta de presupuesto agotado

Para el caso de que estemos llevando a cabo un plan de posicionamiento web SEM, por ejemplo con Google Adwords, este script podría sernos de utilidad.
Asignamos un presupuesto diario para los anuncios, pero una vez agotado este importe, los anuncios dejarán de estar visibles, por lo que puede ser de interés recibir en nuestro correo electrónico una alerta y poder actuar así en consecuencia.

Los pasos a seguir son los siguientes:
1.- En nuestro panel de Google Adwords, seleccionaremos el icono representado por una llave inglesa, y en el menú desplegado seleccionaremos la entrada: "Acciones en bloque" > "Secuencias de comandos"


2.- Crearemos una nueva secuencia de comandos pulsando sobre el icono azul representado por un "+"

3.- En el editor que se nos muestra, insertaremos la lógica del script, que podría ser algo similar a lo siguiente:


function main() {
  var text_email = "";
    var campaignsIterator = AdWordsApp.campaigns().forDateRange("TODAY").get();
    while (campaignsIterator.hasNext()) {
      var campaign = campaignsIterator.next();
      var stats = campaign.getStatsFor("TODAY");
      var name = campaign.getName();
      var cost = stats.getCost(); 
      var budget = campaign.getBudget(); 
      if (cost >= budget) {
        var text_email = text_email+""+name+"
Gasto: "+cost+"
"; } } var table = ""+text_email+"
"; if (text_email!="") { MailApp.sendEmail({ to: 'xxxxxxxxxx@gmail.com', subject: 'Alerta de Presupuesto Agotado', htmlBody: text_email, }) Logger.log(text_email); } }

4.- Una vez creado el código, programaremos que este código se ejecute -por ejemplo- cada hora.

:: Cookies de nuestra página web. ¿Para qué sirve cada una?

A menudo una pregunta que nos hacen es qué cookies se están utilizando en mi página y para qué sirven. Para ver las cookies, podemos selecci...