miércoles, 8 de febrero de 2012

Asteriscos en el monto del cheque


/*

Esta funcion pone asteriscos al inicio del monto del cheque del Adempiere,
esto con el fin de seguridad del mismo, las funciones fnt_right y fnt_left
las puedes encontrar en este mismo blog

*/

-- select asteriscos_numeros('146520');

-- select asteriscos_numeros('14124350175.1520304000');

-- select asteriscos_numeros('12504.');

-- select length('200');

create or replace function asteriscos_numeros(numero character varying)
returns character varying as $$
declare
    resultado character varying;
    maximo numeric;
    contador numeric;
    asteriscos character varying;
    nuevo_numero character varying;
    k numeric;
    entero character varying;
    decimales character varying;
begin
    -- Establecemos el tamaño máximo del texto
    maximo = 15;   

    -- Establecemos valores por defecto
    resultado = '';
    contador = 0;
    asteriscos = '';
    entero = substring(numero, 0, position('.' in numero));
    decimales = coalesce(substring(numero, position('.' in numero) + 1, length(numero)), '');
    nuevo_numero = '';
    k = 0;
   
    if(decimales = '.' or decimales = '')then
        decimales = '';
    else
        decimales = '.' || decimales;
    end if;
       
    -- Establecer la coma como separador de miles donde corresponda
   
    contador = length(entero);
   
    while contador > 0 loop
        contador = contador - 1;
        k = k + 1;
       
        if(k = 3)then
            if(length(nuevo_numero) = 0)then
                nuevo_numero = fnt_right(entero, 3);
            else
                nuevo_numero = fnt_left(fnt_right(entero, length(nuevo_numero) + 3), 3) || ',' || nuevo_numero;
            end if;
           
            k = 0;
        end if;
    end loop;
   
    if(length(entero) > 3)then
        if(k = 1)then
            nuevo_numero = fnt_left(fnt_right(entero, length(nuevo_numero) + 1), 1) || ',' || nuevo_numero;
        end if;
       
        if(k = 2)then
            nuevo_numero = fnt_left(fnt_right(entero, length(nuevo_numero) + 2), 2) || ',' || nuevo_numero;
        end if;
    else
        nuevo_numero = entero;
    end if;
   
    contador = 0;
   
    if(length(numero) > 0 and length(numero) < maximo)then
        contador = maximo - length(numero);
       
        while contador > 0 loop
            asteriscos = '*' || asteriscos;
           
            contador = contador - 1;
        end loop;
       
        resultado = asteriscos || nuevo_numero;
    else
        resultado = '**' || nuevo_numero;
    end if;
   
    return resultado || decimales;
end;
$$ language plpgsql;

No hay comentarios:

Publicar un comentario