domingo, 10 de abril de 2016

[Corregido] Error al crear Ordenes de compra, Facturas, Presupuestos y Ordenes de venta luego de migración en VTiger

Luego de una migración en vTiger, uno espera no tener ningun problema. Aún así, nos piden que hagamos backup para estar preparados para nuestros inmerecidos y muy probables problemas de migración.

Listo. Backup de código y base de datos creados. Y comenzamos la migración de vTiger.

Una vez terminados, nos hemos topado con algunos mensajes de advertencia de pequeñas ejecuciones en la base de datos que no se pudieron completar satisfactoriamente, y aunque reintentamos la migración siguen saliendo. Optamos por no prestarle atención y correr a ejecutar nuestra nueva versión de vTiger.

Aunque ya activamos el "log" y "trace" para validar el error, nos encontramos con que es imposible crear una nueva Orden de Compra, Factura, Presupuesto u Orden de compra, y siempre nos aparece el mensaje de:

{"success":false,"error":{"code":"result is not an object","message":"result is not an object"}}

...o en español:

{"success":false,"error":{"code":"El registro al que pretende acceder no existe","message":"El registro al que pretende acceder no existe"}}

No hay nada que temer... pueden consultar durante 2 días, tal como yo lo hice en todos los foros, y seguir cada paso y no encontrar ninguna solución en el universo indexado de Internet... o simplemente vayan directamente en la base de datos y hagan los siguientes dos cambios:

1) En la estructura de la tabla "vtiger_users"

En la estructura de la tabla, asegurarse que existe el campo "is_owner", y debe ser "varchar(5).

2) En los registros la tabla "vtiger_field"

Revisar los registros de los 4 módulos que nos están generando problemas, con las siguientes consultas:

Para Facturas:
SELECT * FROM vtiger_field WHERE tablename = 'vtiger_invoice' ORDER BY columnname

Para Ordenes de venta
SELECT * FROM vtiger_field WHERE tablename = 'vtiger_salesorder' ORDER BY columnname

Para Presupuestos:
SELECT * FROM vtiger_field WHERE tablename = 'vtiger_quotes' ORDER BY columnname

Para Ordens de compra:
SELECT * FROM vtiger_field WHERE tablename = 'vtiger_purchaseorder' ORDER BY columnname

La solución es, simplemente, eliminar el registro duplicado que aparece en cada consulta, y dejar uno de ellos (por ejemplo, he dejado el primero):


Y listo. vTiger vuelve a ser tan eficiente como antes.

Requiere ayuda en su nuevo CRM?  Podemos ayudarle en Solutecia sas.

jueves, 7 de abril de 2016

[Corregido] Call to a member function getPicklistValues() on a non-object in /crm/modules/Users/models/Record.php on line 494

Acabo de encontrarme con este mensaje de error luego de una migración de VTiger de 5.4 a 6.1.

En el foro de VTiger no han dado con una solución satisfactoria, y por algún motivo no tengo privilegios para postear la solución en dicho foro.

Bueno, aquí con la solución.

El problema lo podemos resolver directamente en el archivo ubicado en la ruta:
modules/Users/models/Record.php

Inicialmente, aparece esta código al rededor de la línea 494:

//-----------------------------------------------------------------------------
$hour_format = $fieldModel['hour_format']->getPicklistValues();
$start_hour = $fieldModel['start_hour']->getPicklistValues();

        $defaultValues = array('00:00'=>'12:00 AM','01:00'=>'01:00 AM','02:00'=>'02:00 AM','03:00'=>'03:00 AM','04:00'=>'04:00 AM','05:00'=>'05:00 AM',
                    '06:00'=>'06:00 AM','07:00'=>'07:00 AM','08:00'=>'08:00 AM','09:00'=>'09:00 AM','10:00'=>'10:00 AM','11:00'=>'11:00 AM','12:00'=>'12:00 PM',
                    '13:00'=>'01:00 PM','14:00'=>'02:00 PM','15:00'=>'03:00 PM','16:00'=>'04:00 PM','17:00'=>'05:00 PM','18:00'=>'06:00 PM','19:00'=>'07:00 PM',
                    '20:00'=>'08:00 PM','21:00'=>'09:00 PM','22:00'=>'10:00 PM','23:00'=>'11:00 PM');
//-----------------------------------------------------------------------------

Por algún motivo luego de la migración, no toma el listado por defecto de los Picklist para el listado de los horarios, pero si incluye los valores por defecto una línea más abajo.

Parece algo poco lógico, que hayan colocado los valores por defecto luego, yo simplemente le di el orden que me pareció más acertado.  Por lo tanto lo dejé de la siguiente manera:

//-----------------------------------------------------------------------------
        $defaultValues = array('00:00'=>'12:00 AM','01:00'=>'01:00 AM','02:00'=>'02:00 AM','03:00'=>'03:00 AM','04:00'=>'04:00 AM','05:00'=>'05:00 AM',
                    '06:00'=>'06:00 AM','07:00'=>'07:00 AM','08:00'=>'08:00 AM','09:00'=>'09:00 AM','10:00'=>'10:00 AM','11:00'=>'11:00 AM','12:00'=>'12:00 PM',
                    '13:00'=>'01:00 PM','14:00'=>'02:00 PM','15:00'=>'03:00 PM','16:00'=>'04:00 PM','17:00'=>'05:00 PM','18:00'=>'06:00 PM','19:00'=>'07:00 PM',
                    '20:00'=>'08:00 PM','21:00'=>'09:00 PM','22:00'=>'10:00 PM','23:00'=>'11:00 PM');

$hour_format = $defaultValues;
$start_hour = $defaultValues;
//-----------------------------------------------------------------------------

Y tema solucionado.

7 razones para no usar Laravel en tu proyecto de PHP

En más de 40 años de experiencia como programador y director de proyectos de programación, he aprendido que cada requerimiento tiene mejores...