CREATE OR ALTER FUNCTION FN_GERAR_EAN_2 (
    PREFIXO_EAN VARCHAR(13),
    LPAD1 INTEGER,
    CONTADOR INTEGER = 0)
RETURNS VARCHAR(13)
AS
DECLARE VARIABLE CODIGO_EAN VARCHAR(13);
DECLARE VARIABLE GERAR_NOVO INTEGER;
begin

  IF(:CONTADOR < 1000)THEN
  BEGIN
       :CODIGO_EAN = FN_LPAD(GEN_ID(GTBEAN, 1),:LPAD1,'0');

       GERAR_NOVO = COALESCE((SELECT FIRST 1
                                1
                            FROM TBEAN T
                            WHERE T.PREFIXO = :PREFIXO_EAN
                            AND T.CODIGO = :CODIGO_EAN
                            ORDER BY T.CODIGO ASC),0);

       IF(GERAR_NOVO = 1)THEN
       BEGIN
            :CODIGO_EAN = FN_GERAR_EAN_2(:PREFIXO_EAN, :LPAD1, :CONTADOR + 1);
       END

  END ELSE
  BEGIN
       EXCEPTION "..." 'ERRO AO GERAR EAN';
  END

  return :CODIGO_EAN;
end;

CREATE OR ALTER function FN_GERAR_EAN(
PREFIXO_EAN VARCHAR(13),
INTERVALO_EAN  VARCHAR(1),
CONTADOR INTEGER)
returns varchar(13)
as
declare variable STR1  INTEGER;
declare variable STR2  INTEGER;
declare variable DIF1  INTEGER;
declare variable LPAD1 INTEGER;
declare variable validador integer;
declare variable CODIGO_EAN VARCHAR(13);

begin
  :validador = 0;
  IF(:CONTADOR <= 10)THEN
  BEGIN
     IF(:INTERVALO_EAN = '1')THEN
     BEGIN
         /*SE GERAR CODIGO EAN POR INTERVALO*/
         :LPAD1 = 0;
         IF(CHAR_LENGTH(:PREFIXO_EAN) = 7)THEN
         BEGIN
           :LPAD1 = 5;
         END

         IF(CHAR_LENGTH(:PREFIXO_EAN) = 8)THEN
         BEGIN
           :LPAD1 = 4;
         END

         :STR1       = CAST(COALESCE((SELECT FIRST 1 DISTINCT T.CODIGO FROM TBEAN T WHERE T.PREFIXO = :PREFIXO_EAN ORDER BY T.CODIGO ASC) ,0) AS INTEGER);
         :STR2       = CAST(COALESCE((SELECT FIRST 1 DISTINCT T.CODIGO FROM TBEAN T WHERE T.PREFIXO = :PREFIXO_EAN ORDER BY T.CODIGO DESC),0) AS INTEGER);
         :DIF1       = :STR2-:STR1;

         IF(:DIF1 <> 0)THEN
         BEGIN
              :CODIGO_EAN = FN_GERAR_EAN_2(:PREFIXO_EAN,:LPAD1);
         END ELSE
         BEGIN
              :CODIGO_EAN = FN_LPAD(GEN_ID(GTBEAN, 1),:LPAD1,'0');
         END

     END ELSE
     BEGIN
        /*SE NÃO GERAR CODIGO EAN POR INTERVALO*/
        :CODIGO_EAN = FN_LPAD(GEN_ID(GTBEAN, 1),4,'0');
     END
    return :CODIGO_EAN;
  END ELSE
  BEGIN
    EXCEPTION "..." 'ERRO AO GERAR CODIGO EAN, VERIFICAR PARAMETRO DE SISTEMA ';
  END
end;

