Agradecimiento en este Año que Finaliza

Buen día tengan todos ustedes, Lectores de este Blog.

con esta entrada, es mi sentir realizar un agradecimiento a todos ustedes que hacen de este blog lo que es.

Es muy gratificante el saber que a muchos de ustedes les ha servido como guía para sus labores e investigaciones, y eso claro me da mucho gusto, ya que el fin de mis entradas es el contribuir conocimiento, y a la vez aprender de todos ustedes.

Así que, por todo esto, les envío un sincero agradecimiento esperando que en estas fechas se llenen de energía y buenos sentimientos para tener un magnifico y excelente Año 2015, que tengan muchos nuevos propósitos y que poco a poco en el transcurso del tiempo vayan realizándolos, logrando cumplir todos sus objetivos.

Animo y a cumplir con su Destino, siempre con la cara en alto, mirando hacia adelante.

Feliz Navidad!
Feliz Año Nuevo 2015!

Reciban un cordial Saludo!


Chava

Anuncios

Como modificar registros de Vtiger con WebService

Buen dia tengan todos.

Ya antes habia usado la libreria de Vtiger para WebService, como lo explico en esta entrada. Pero nunca me tope con el tema de Actualizar registros utilizando dicha libreria.

El día de hoy recibi un comentario aqui en mi blog de como se hacia para hacer un UPDATE de un registro, asi que me puse manos a la obra.

Continúa leyendo Como modificar registros de Vtiger con WebService

Ejecutar Funciones Personalizadas en Workflows de Vtiger

Buen día, espero que se encuentren bien todos los lectores de este blog.

En base a un comentario dentro unos de mis post, me atreví a escribir este relacionado con el uso las funciones personalizadas para ejecución en un Workflow dentro los módulos de Vtiger.

Paso a comentar el código para el registro de dichas funciones y que sean accesibles en la configuración de las tareas de los Workflows.

Continúa leyendo Ejecutar Funciones Personalizadas en Workflows de Vtiger

Como agregar informacion de campos personalizados a informes PDF de Vtiger

En ocasiones es ncesario que nuestros informes o formatos PDF contengan informacion extra que default no viene programado en los modulos de Vtiger, y muchas veces dicha informacion ni siquiera existe en la base de datos de una instalacion limpia de Vtiger (cuando recien instalamos), muchas veces la informacion se encuentra en campos personalizados que nosotros vamos agregando conforme pasa el tiempo.

En esta entrada aprenderemos como agregar informacion de un campo personalizado al informe de PDF  de Invoice, que no se limita a este modulo, es igual para cualquier otro, por ejemplo: SalesOrder.

Para agregar informacion al formato PDF de Invoice debes abrir el archivo modules/Invoice/InvoicePDFController.php

En dicho archivo, existe la clase Vtiger_InvoicePDFController, la cual tiene cuatro metodos, solo voy a mencionar dos por el momento:
– function buildHeaderModelColumnCenter()
– function buildHeaderModelColumnRight()

el formato PDF, si lo analizas, tiene una columna central, en donde se imprime informacion del cliente, numero de pedido, etc. para dicha informacion, la clase Vtiger_InvoicePDFController usa el metodo buildHeaderModelColumnCenter().

Y para la columna de la derecha vez que imprime informacion de fecha y direccione tanto de factura como de entrega, para esto el metodo usado es buildHeaderModelColumnRight().

Ahora bien, como agregar informacion?

Tenemos que agregar la etiqueta y el valor, para este ejemplo voy a agregar la etiqueta y el valor a la columna central del informe, para lo que modifico el metodo buildHeaderModelColumnCenter():

function buildHeaderModelColumnCenter() {
    // Agregando informacion de campos personalizados para Imprimir en el formato PDF
    // Defino el nombre del Modulo del que quiero extraer la informnacion
    $accountModname = 'Accounts';
    // Defino el nombre del campo que quiero obtener, en este caso es un campo personalizado
    $fieldname = 'cf_494';

    // Obtengo una instancia del modulo "Accounts" para el registro del cliente en cuestion ( $this->focusColumnValue('account_id') )
    $modObj = CRMEntity::getInstance($accountModname);
    $modObj->retrieve_entity_info($this->focusColumnValue('account_id'), $accountModname);

    // Asigno la etiqueta y el valor obtenido de la instancia Accounts a variable normales
    $customDataLabel = "RFC";
    $customDataValue = $modObj->column_fields[$fieldname];

    // -------------------------------- //

    $customerName = $this->resolveReferenceLabel($this->focusColumnValue('account_id'), 'Accounts');
    $contactName = $this->resolveReferenceLabel($this->focusColumnValue('contact_id'), 'Contacts');
    $purchaseOrder = $this->focusColumnValue('vtiger_purchaseorder');
    $salesOrder = $this->resolveReferenceLabel($this->focusColumnValue('salesorder_id'));

    $customerNameLabel = getTranslatedString('Customer Name', $this->moduleName);
    $contactNameLabel = getTranslatedString('Contact Name', $this->moduleName);
    $purchaseOrderLabel = getTranslatedString('Purchase Order', $this->moduleName);
    $salesOrderLabel = getTranslatedString('Sales Order', $this->moduleName);

    $modelColumnCenter = array(
        $customerNameLabel => $customerName,
        $purchaseOrderLabel => $purchaseOrder,
        $contactNameLabel => $contactName,
        $salesOrderLabel => $salesOrder,
        // Agrego los datos personalizados al Array de Modelos para mi PDF
        $customDataLabel => $customDataValue,
    );
    return $modelColumnCenter;
}

En el ejemplo obtengo datos de la cuenta del cliente al cual pertenece la Factura actual, en este caso el dato obtenido pertenece a un campo personalizado que esta identificado por “cf_494”, pero puede ser cualquier otro campo.

***Tip para conocer el nombre del campo:

– Recomiendo usar Mozilla Firefox, agregar la extension FireBug.

-Despues abrir el listado de cuentas, abrir cualquier cuenta, despues buscar el campo deseado, colocar el puntero del mouse encima, dar click en el link “editar” que aparece.

-Por ultimo hacer click derecho del mouse y seleccionar “Inspeccionar elemento conFirebug”. Con esto se abre el panel de propiedades y codigo dentro de FireBug. como se muestra en la siguiente imagen:

En la imagen esta marcado en un ovalo Rojo el nombre del campo que deben usar obtener el dato deseado.

En esta otra imagen muestro como quedo mi ejemplo en PDF:

Espero sea de utilidad para los visitantes.

Saludos cordiales.

Chava

Trabajando con WebService de Vtiger…

A pasado mucho tiempo desde que escribi por ultima vez, pero ahora voy a hacerlo aportando algo sobre como trabajar con el “vtwsclib1.4”  que es la libreria para WebService con Vtiger.

En primer lugar se necesitara descargar la libreria, para esto pueden entrar en el Forge de Vtiger en el apartado del proyecto , ahi encontraran los archivos, un zip con la libreria y un PDF con la documentacion y guia rapida.

Vamos a trabajar sobre un directorio que nombraremos “testvtwsclib”, entonces dentro de el descomprimimos el archivo zip que descargamos, quedandonos la siguiente estructura:

Se puede observar pues los directorios que estan contenidos en “vtwsclib“. ahora bien, vamos a crear un archivo nuevo llamado “index.php” y lo guardamos en el directorio “testvtwsclib”. Este ejemplo lo que hace es obtener la lista de modulos que actualmente estan instalados en Vtiger y muestra un SELECT con dicho listado, al momento de seleccionar un modulo de la lista se procede a mostrar la descripcion del mismo.

El contenido del archivo index.php es el siguiente:

// Incluir el archivo base de la libreria para PHP
include_once('vtwsclib/Vtiger/WSClient.php');

// Configurar el usuario con el que deseamos conectar con Vtiger
$user = 'admin';
$key  = 'O3BkR9oHR47x';

// Aqui va el URL de tu instalacion de Vtiger
$url = 'http://nombrehost.com/vtigercrm';

// Se genera se inicializa el Obejto WSClient pasandole como parametro el URL
$client = new Vtiger_WSClient($url);

// Lo siguiente es hacer el Login usando el Usuario y Key para acceso
$login = $client->doLogin($user, $key);

// $login debe ser TRUE si se ha logrado entrar correctamente, si ocurrio un error sera FALSE
if(!$login) {
echo 'Login Failed';
}
else {
    // En el caso de este script, se
    $modulename = (isset($_POST['mod']))?$_POST['mod']:$_GET['mod'];

    //** Imprimir el combo con la lista de modulos del CRM **//

    // Se obtienen todos los modulos que actualmente estan instalados en Vtiger
    $modules = $client->doListTypes();

    $html_string1 = '<form name="modules" method="get">'.
                   '<select name="mod">';

    foreach($modules as $modname => $moduleinfo) {
        $selected = '';
        if($modname == $modulename) $selected = 'selected=selected';
    
        $html_string1 .= '<option '.$selected.' value='.$modname.'>'.$modname.'</option>';
    }

    $html_string1 .= '</select>' .
                 '<input type="submit" name="checkMod" value="Consultar"/>' .
              '</form>';

    echo $html_string1;
    /**  Fin de crear la lista de modulos **/

    if($modulename!='')
    {
        $html = getModuleDescription($modulename);
        echo $html;
    }
}

/**
* Devuelve  la descripcion del Modulo, cuyo nombre se pase como parametro en $modulename
*/
function getModuleDescription($modulename)
{
    // globales, definidas fuera de la funcion
    global $client;
    global $user;

    $maxcols = 8;

    // Se ejecuta el metodo "doDescribe" que obtiene la configuracion del modulo, en este
    //   se incluyen permisos y campos del modulo.

    $describe = $client->doDescribe($modulename);

    $wasError= $client->lastError();
    if($wasError) {
        echo $wasError['code'] . ':' . $wasError['message'];
    }
    else{
        // Recuperar los permisos que el usuario actual tiene sobre el modulo seleccionado
        $cancreate     = ($describe['createable'])?'Si':'No';
        $canupdate     = ($describe['updateable'])?'Si':'No';
        $candelete     = ($describe['deleteable'])?'Si':'No';
        $canread     = ($describe['retrieveable'])?'Si':'No';
        $fields     = ($describe['fields']);

        $html_string = '<table width="200">'.
                         '<th colspan="2">Permisos para el usuario: <b>'.$user.'</b> en Modulo '.$modulename.'</th>' .
                          '<tr><td>Crear:</td><td>'.$cancreate.         '</td></tr>' .
                          '<tr><td>Actualizar:</td><td>'.$canupdate.    '</td></tr>' . 
                          '<tr><td>Eliminar:</td><td>'.$candelete.    '</td></tr>' .
                          '<tr><td>Leer:</td><td>'.$canread.    '</td></tr>' . 
                        '</table><br/>';

        // Aqui comienza el proceso para formar un "table" en HTML para mostrar la descripcion del modulo y sus campos
        //  incluyendo los campos personalizados

        $html_string .= '<table border="1"><th colspan='.$maxcols.'>Campos</th>';
        $col = 0;
        for($i=0; $i<count($fields); $i++)
        {
            $col ++;
            $tableseppref = '<td style="float: left; margin: 2px 5px 0pt;height:260px; width: 170px;">';
            $tablesepsuf = '</td>';
            if($col == 1) {
                $tableseppref = '<tr>'.$tableseppref;
            }
            elseif($col == $maxcols)
            {
                $tablesepsuf = $tablesepsuf.'</tr>';
                $col = 0;
            }
        
            $fieldlabel         = ($fields[$i]['label']) ? $fields[$i]['label'] : $fields[$i]['name'];
            $fieldname            = $fields[$i]['name'];
            $fieldismandatory     = ($fields[$i]['mandatory'])?'Si':'No';
            $fieldtype            = $fields[$i]['type']['name'];
            $dateformat            = ($fields[$i]['type']['name'] == 'date') ? '<br/>format: '.$fields[$i]['type']['format'] : '';
            $valuesLabel = '';
            
            // Hacemos una llamada a la función local "getRelList()" con la que nos regresa un string en formato HTML con los valores
            //  de los campos si estos fueran de tipo "picklist" o "reference"
            $fieldValues = getRelList($fieldtype, $fields[$i]);
        
            if($fieldValues != ''){
                $valuesLabel = 'Valores';
            }
        
            // Aqui solo formaremos un string de HTML para mostrar la descripcion del campo en una "table"
            $html_string .= $tableseppref.
                '<table style="float: left; width: 100%;"><th style="float: none; background-color: rgb(194, 194, 194);">'.$fieldlabel.'</th>'.
                '<tr><td>DB Name: '.$fieldname.'</td></tr>'.
                '<tr><td>Obligatorio: '. $fieldismandatory .'</td></tr>'.
                '<tr><td>Tipo: '.$fieldtype.' '.$dateformat.'</td></tr>'.
                '<tr><td>'.$valuesLabel.'</td></tr>'.
                '<tr><td>'.
                     '<div style="float: left;width: 100%;height: 100px; overflow: auto;">'.
                         $fieldValues.
                     '</div>'.
                '</td></tr>'.
                '</table>'.
                $tablesepsuf;
        }

        $html_string .= '</table>';
        return utf8_decode($html_string);
    }
}

/**
* Devuelve los valores de los campos de tipo "picklist" y "reference"
*/
function getRelList($fieldtype, $field, $tag = 'ul', $itemtag = 'li'){
    if(($fieldtype == 'picklist') || ($fieldtype == 'reference'))
    {
    $fieldValues = '<'.$tag.'>';
    if($fieldtype == 'picklist') $cellValues     = 'picklistValues';
    if($fieldtype == 'reference') $cellValues     = 'refersTo';

    for($f=0; $f < count($field['type'][$cellValues]); $f++)
    {
        $value = '';
        if($fieldtype == 'picklist')
        $value = $field['type'][$cellValues][$f]['label'].'<br/>('.$field['type'][$cellValues][$f]['value'].')';
        if($fieldtype == 'reference')
            $value = $field['type'][$cellValues][$f];

            $fieldValues .= '<'.$itemtag.'>'.$value.'</'.$itemtag.'>';
        }
        $fieldValues .= '</'.$tag.'>';

        return $fieldValues;
    }
    return '';
}

Hasta aqui queda definido el contenido del script, las funciones auxiliares “getModuleDescription()” y “getRelList()” se incluyeron en el mismo script por razones de comodidad para mostrar el funcionamiento, pero bien pueden estar definidas en otros script y hacer un “include()”.

En este ejemplo solo hacemos uso del webservice para obtener la lista de modulos con:

$client->doListTypes();

asi como para obtener la descripcion de cada uno de ellos con:

$describe = $client->doDescribe($modulename);

Y por ultimo saber si ocurrio algun error al realizar la ultima operacion:

$wasError= $client->lastError();

A continuacion se muestra una pantalla del resulatdo final:

*Nota: Cabe señalar que el usuario que se usa para obtener el acceso es el mismo con el que se inicia sesion en Vtiger y el Key se puede obtener revisando las preferencias del usuario, esto se puede ver en el modulo de “configuracion” y eligiendo la opcion de “Usuarios”, despues eligen el usuario que ustedes quieran para ver la Key (Clave de Acceso).

En proximas entradas vere la posibilidad de mostrar como agregar nuevos registros a un modulo y obtener la informacion de determinado registro existente.

Espero que sea de utilidad esta informacion y espero sus comentarios.

Saludos.

“Chava”

Agregando campos extra a la informacion de la empresa…

He tenido que agregar un campo para la informacion de la empresa en mi instalacion de Vtiger. En mi caso, la empresa lleva un RFC, pero vtiger permite agregar solo informacion especifica y limitada al momento de que deseemos guardar, esto se hace entrando a Vtiger, en el menu “configuracion”->” Información de la Empresa ” y los campos que nos muestra son por ejemplo:

  • Nombre de la empresa
  • Logo
  • Pais
  • Telefono
  • website
  • etc. etc

Pero no tiene campos como RFC, No. Cuenta del banco,.. etc. Y cuando queremos agregar esa informacion que podriamos utilizar en reportes, o alguna personalizacion que deseemos realizar de cualquier tipo, entonces nos tenemos que limitar a agregarlo directamente solo en codigo manualmente. Para evitar esto me he decidido a dar un ejemplo de como agregar un campo extra llamado “RFC” a nuestra configuracion.

************ Agregar Campos de datos para la informacion de Empresa *********************

Tabla de la BD involucrada:

Acerca de VTiger CRM

Este sistema es un CRM muy completo que puede utilizarse para la gestion de clientes. Es decir, dar un seguimiento completo de cuentas, contactos, precontactos, pedidos, facturacion, etc. y lo mas llamativo, es Open Source!!

En fin, recomendado para pequeñas y medianas empresas que desean tener de manera automatizada la informacion de su empresa.

Este CRM tiene toda una comunidad detras, en la cual se dan actualizaciones, soporte por parte de otros usuarios, modulos funcionales para diferentes aplicaciones, etc.

Asi que, si estas interesado con toda confianza descargate tu copia directamente en el sitio oficial de Vtiger

“Chava”