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.
hace 3 semanas   NeoRazorX   admin

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.

hace 3 semanas   emailforos.es_103

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".

image

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.

hace 3 semanas   NeoRazorX   admin

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)
{
   ...
}

hace 3 semanas   NeoRazorX   admin

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.

hace 3 semanas   NeoRazorX   admin

¿Cuántos clientes tenéis? 6 caracteres se quedan muy cortos para ese sistema.

hace 2 semanas   emailforos.es_103

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.

hace 2 semanas   NeoRazorX   admin

Precisamente lo digo porque añadir más caracteres a codcliente implica cambiarlo también en el resto de tablas, y no son pocas.

hace 2 semanas   emailforos.es_103

Sería sólo a los nuevos. con if ($num>9999) sería suficiente, ¿no?

Gracias y un cordial saludo.

hace 2 semanas   NeoRazorX   admin

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.

hace 2 semanas   emailforos.es_103

¡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.

hace 2 semanas   NeoRazorX   admin

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.


Si lo deseas, puedes modificar las prioridades de tus peticiones en el plan de desarrollo.

  Plan de desarrollo