Esta consulta es de hace 8 años. No tome esta información como actualizada. Si tiene problemas con FacturaScripts, consulte la sección ayuda o la sección contacto
emailforos.es_f74d39

Personalización nuevo código cliente (get_new_codigo()...

emailforos.es_f74d39   España   15-11-2016 16:30:17   16-12-2016 19:59:33   245  
Personalización nuevo código cliente (get_new_codigo() de cliente.php).

Antes que nada, indicar que no tengo mucha idea de programación. Sólo hago apaños así que puedo haberme equivocado en cualquier tontería.

Queremos empezar a usar un código cliente que empiece por el código de país ("ES" para España, "PT" para Portugal, "CN" para China, etc). De tal manera que sea, por ejemplo ES0000, ES0001, ES0002, etc.

Bien, hasta ahora usábamos un código personalizado que sólo era un cadena de 6 números y la personalización funcionaba bien.

$codclientes = $this->db->select("SELECT ".$this->db->sql_to_int('codcliente')." AS cod FROM ".$this->table_name." ORDER BY cod ASC;");
if($codclientes)
{
foreach($codclientes as $n)
{
if( intval($n['cod']) > $num)
{
$encontrado = TRUE;
break;
}
else
$num++;
}
}
else
{
return sprintf('%06s', intval($num));
}
}
if($encontrado)
{
return sprintf('%06s', intval($num));
}
else
{
if ($num<$max)
{
return sprintf('%06s', intval($num));
}
else
{
return sprintf('%06s','NO_HAY');
}
}


Ahora bien, ahora, para poder contar necesito extraer las dos primeras letras y quedarme con los números, para eso he sustituido
intval($n['cod']) > $num
por
intval(substr($n['cod'],-4)) > $num
, en vez de devolverme 1 para ES0001, siempre devuelve 0, dándome siempre el mismo código ES0000. Curiosamente si pongo
intval(substr("ES0001",-4)) > $num
, el resultado es correcto e igual a 1.

¿Alguna sugerencia?

Muchas gracias.
El primer problema que le veo es que necesitas el código del país, y eso está en direccion_cliente, y para poder guardar la dirección necesitas el cliente, que necesita un código primero ... así que la única forma que veo de hacerlo es dejar la función tal cual y modificar el código en el save().

En el save() ya puedes consultar la dirección, y si la hay, con el codpais ya tienes el ES, luego simplemente cambias el 00 inicial por ES. No es sencillo, pero es la única forma que veo de hacerlo tocando solamente el modelo.
Gracias Carlos.

Sólo he puesto una porción. Es que el código me parece muy largo para poner en el post. Lo comparto a través de github.

Tal y como lo tenemos ahora, ya consulto el país primero y luego el código postal (a través del POST). De esta manera $rest son los dos primeros dígitos del código postal (por ejemplo 28 para Madrid, 15 para A Coruña, etc). De modo que generamos el código en función de la provincia (280001 para el cliente 1 de Madrid). Si es de fuera, hasta ahora, les asignaba un número específico (65 para Alemania, etc). Y al ser sólo números funciona perfectamente y sin problemas.

Es una codificación "heredada" del pasado de dos de los socios de la empresa. El problema es que de los 47 números restantes para extranjero, ya llevamos usados 45 y hemos pensado una solución que es la de incluir el código país para los nuevos países.

Pero, me he encontrado con que la nueva codificación escogida no es directo saber cual es el último código de la base de datos. Y si encima hace cosas raras (para un novato como yo) pues más.

Cierto es que se me olvidó comentar es que la consulta también la modifiqué (testada desde FS)
        $codclientes = $this->db->select("SELECT ".$this->db->sql_to_int('codcliente')." AS cod FROM ".$this->table_name." WHERE codcliente REGEXP '^$rest' ORDER BY cod ASC;");
para filtrar por los dos caracteres que tengo en $rest, de modo que si $rest = "PT", por ejemplo, pues me saca todos los clientes que empieza por "PT".

imagen

Sé que es más un tema de programación y muy personal, pero llevo rompiendo los cuernos varios días y leyendo posts y más posts de php y no encuentro nada que me de una pista buena.

Intuyo que es un problema de cómo es $n['cod'] ya que si le meto al substr una cadena directamente lo hace correctamente pero mis conocimientos no llegan a tanto como para saber ver qué valores y cómo son los que quedan almacenados en $n. Y si en teoría el original, tratando sólo dígitos, funciona... Vamos loquito estoy.

Quizás deberíamos replantearnos el cómo.

Gracias por vuestra ayuda.
Un par de apuntes:

No siempre tendrás $_POST['pais'] y $_POST['nuevo_pais'], así que mejor empezar así la función:
if( !isset($_POST['pais']) )
{
return parent::get_new_codigo();
}
else
{
... tu código
}
Así te evitas problemas.

Otra modificación importante: los else if. En lugar de:
if(X)
{
....
}
else
{
if(Y)
{
...
}
}

Puedes hacer:
if(X)
{
....
}
else if(Y)
{
...
}
La consulta:
$codclientes = $this->db->select("SELECT ".$this->db->sql_to_int('codcliente')." AS cod FROM ".$this->table_name." WHERE codcliente REGEXP '^$rest' ORDER BY cod ASC;");

Puedes cambiarla por:
$codclientes = $this->db->select("SELECT codcliente AS cod FROM ".$this->table_name." WHERE codcliente LIKE '$rest%' ORDER BY cod ASC;");

Es más compatible.
¿Cuántos clientes tenéis? 6 caracteres se quedan muy cortos para ese sistema.
Buenas, Carlos.

Tú siempre en la diana... Ha sido cambiar la consulta y funcionar el algoritmo. BRAVO!

Respecto a los clientes, si el número que indica FS es correcto, tenemos 2385 clientes y de acuerdo a nuestra numeración, el sitio con más es Barcelona (código 08XXXX) con 761 clientes (aún hay cancha). Pero ya vamos con ventas en 46 países. Ojalá lleguemos a los 9999 clientes en alguna zona rápidamente. Es complicado pero ya lo tenemos previsto: añadir 2 ceros delante 08009999

Muchas, muchas gracias.

Un cordial saludo.
Precisamente lo digo porque añadir más caracteres a codcliente implica cambiarlo también en el resto de tablas, y no son pocas.
Sería sólo a los nuevos. con if ($num>9999) sería suficiente, ¿no?

Gracias y un cordial saludo.
No me has entendido, hay un límite de caracteres para esa columna en las tablas, por mucho que pongas dos caracteres más al código, si la tabla no ha sido modificada no se van a copiar.
¡Porras! Ni había pensado en eso. Di por hecho que era más grande que 6 caracteres la capacidad del campo codcliente de la tabla.

Pues nos planteas una duda a futuro (largo, pero a futuro). Si yo modifico la base de datos, cada una de las tablas. ¿Se modificaría el campo de cada tabla en una posterior actualización de la base de datos del sistema (con una nueva funcionalidad, etc).?

Carlos, si crees conveniente que mueva esto a nueva pregunta, me lo dices. Borras este y creo esto como nueva pregunta.

Muchas gracias por tu tiempo y trabajo.
FacturaScripts adapta la estructura de las tablas acorde a los ficheros XML de cada tabla, en cada plugin, en sus directorio model/table
Los tipos de las columnas y su número de caracteres solamente los comprueba al crear o cuando está activada la comprobación de tipos.

De cara al futuro ampliaré codcliente, 6 caracteres es poco.
Como no está cerrado aprovecho.

Me pasa una cosa rara con mi personalización y es que cuando creo un cliente desde Clientes funciona perfectamente, sin embargo, cuando el nuevo cliente lo genero desde nueva_venta me va al get_new_codigo() del cliente.php de facturacion_base no el mío nuevo.

La llamada la hace desde el código que me indico NeoRazorX unos posts más arriba y que agregué en mi plugin:


if( !isset($_POST['pais']) )
{
return parent::get_new_codigo();
}
else
{
... tu código
}


Por lo tanto deducía que aunque en el formulario le pongas el país y le des a guardar, no usa la variable pais o nuevo_pais.
imagen

Sin embargo, si le quito la condición "if( !isset($_POST['pais']) )" funciona perfectamente.

Pero claro, viniendo la sugerencia de NeoRazorX me da miedo quitar esa comprobación por si puede provocar un problemón.

¿Alguna sugerencia?

Por si interesa ver el código completo, coloco en nuestro Github

Muchas gracias por vuestra ayuda.

Gracias
[[Cerrado por inactividad]]
¿Problemas con FacturaScripts?
Si tiene problemas con FacturaScripts consulte la sección ayuda o la sección contacto



Cookies
Usamos cookies en nuestro sitio web para brindarte la experiencia más relevante recordando tus preferencias y visitas repetidas. Al hacer clic en "Aceptar", aceptas el uso de TODAS las cookies necesarias.
Copyright (c) 2013-2024 FacturaScripts
0.14734s

Soporte