SET TERM ^ ;

create or alter procedure VALIDE_ENTRADA (
    CODIGO varchar(50),
    BODEGA integer)
returns (
    ESTADO integer,
    ARTICULO varchar(15),
    DESCRIPCION varchar(300),
    MENSAJE varchar(100))
as
declare variable BODANT INTEGER;
declare variable ORDEN INTEGER;
declare variable ORDBANT INTEGER;
declare variable ENTRADA CHAR(1);
begin
if (char_length(CODIGO) > 11) then
    begin
    ARTICULO = LEFT(codigo,  char_length(CODIGO)-9);
    SELECT ARTI_DES FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DESCRIPCION;
    if (DESCRIPCION IS NULL) then
        BEGIN
        ESTADO = 2;  -- Codigo incorrecto
        MENSAJE = 'NO SE ENCONTRO EL ARTICULO ' || :ARTICULO;
        END
    else
        begin
        /* valide la bodega */
        BODANT = NULL;
        SELECT BODC_ORDEN, BODC_ENTRADA FROM BODEGA_CONTROL WHERE BODC_COD = :bodega
            INTO :ORDEN, :ENTRADA;
        if (ENTRADA <> 'S') then
            begin
            ESTADO = 5; -- Bodega no puede registrar entradas
            MENSAJE = 'LA BODEGA ' || :bodega || ' NO PERMITE HACER ENTRADAS';
            end
        select max(BODC_COD) from MOVIMIENTO_INVENTARIO where mvin_codigo = :CODIGO into :BODANT;
        if (BODANT IS NULL) then
            begin
            if (ORDEN > 1) then
                begin
                ESTADO = 3; -- No hay una entrada en la bodega previa
                MENSAJE = 'NO HAY UNA ENTRADA EN LA BODEGA PREVIA PARA EL ARTICULO ' || :ARTICULO;
                end
              else
                ESTADO = 1;  -- OK es la primer abodega
            end
        else
            begin
            select BODC_ORDEN from BODEGA_CONTROL where BODC_COD = :BODANT into :ORDBANT;
            if ((ORDEN - ORDBANT) < 1) then
                begin
                ESTADO = 4; -- YA HAY UNA ENTRADA EN LA BODEGA
                MENSAJE = 'YA HAY UNA ENTRADA PREVIA EN LA BODEGA ' || :BODEGA || ' PARA EL ARTICULO ' || :ARTICULO;
                end
            else
                estado = 1;  -- OK
            end
        end
    end
else
    begin
    ESTADO = 2; -- Codigo incorrecto
    MENSAJE = 'NO SE ENCONTRO EL CODIGO ' || :codigo;
    end
suspend;
end^

SET TERM ; ^

/* Following GRANT statements are generated automatically */

GRANT SELECT ON ARTICULO TO PROCEDURE VALIDE_ENTRADA;
GRANT SELECT ON BODEGA_CONTROL TO PROCEDURE VALIDE_ENTRADA;
GRANT SELECT ON MOVIMIENTO_INVENTARIO TO PROCEDURE VALIDE_ENTRADA;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE VALIDE_ENTRADA TO PUBLIC;

SET TERM ^ ;

create or alter procedure VALIDE_SALIDA (
    CODIGO varchar(50),
    BODEGA integer)
returns (
    ESTADO integer,
    ARTICULO varchar(15),
    DESCRIPCION varchar(300),
    MENSAJE varchar(100))
as
declare variable BODANT INTEGER;
declare variable ULTBOD INTEGER;
declare variable ORDEN INTEGER;
declare variable SALIDA CHAR(1);
declare variable IDMOV INTEGER;
begin
if (char_length(CODIGO) > 9) then
    begin
    ARTICULO = LEFT(codigo,  char_length(CODIGO)-9);
    SELECT ARTI_DES FROM ARTICULO WHERE ARTI_COD = :ARTICULO INTO :DESCRIPCION;
    if (DESCRIPCION IS NULL) then
        BEGIN
        SELECT ARTI_DES FROM ARTICULO WHERE ARTI_COD = :CODIGO INTO :DESCRIPCION;
        if (DESCRIPCION IS NULL) then
            BEGIN
            ESTADO = 2;  -- Codigo incorrecto
            MENSAJE = 'NO SE ENCONTRO EL ARTICULO ' || :ARTICULO;
            END
        ELSE
            BEGIN
            /* ES UN ARTICULO NO PRODUCIDO, NO VALIDE BODEGAS ANTERIORES */
            ARTICULO = CODIGO;
            IDMOV = NULL;
            select MVIN_ID from MOVIMIENTO_INVENTARIO where mvin_codigo = :CODIGO and mvin_entrada = 'S' AND BODC_COD = :bodega
                INTO :idmov;
            if (IDMOV IS NULL) then
                BEGIN
                ESTADO = 3; -- No hay una entrada en la bodega previa
                MENSAJE = 'NO HAY UNA ENTRADA EN LA BODEGA ' || :BODEGA || ' PARA EL ARTICULO ' || :ARTICULO;
                END
            ELSE
                ESTADO = 1; -- OK
            END
        END
    ELSE
        begin
        /* valide la bodega */
        BODANT = NULL;
        SELECT BODC_ORDEN, BODE_SALIDA FROM BODEGA_CONTROL WHERE BODC_COD = :bodega
            INTO :ORDEN, :SALIDA;
        if (SALIDA <> 'S') then
            begin
            ESTADO = 5; -- Bodega no puede registrar salidas
            MENSAJE = 'LA BODEGA ' || :bodega || ' NO PERMITE HACER SALIDAS';
            end
        else
            begin
            BODANT = NULL;
            SELECT BODC_COD FROM BODEGA_CONTROL WHERE BODC_ORDEN = :orden-1 into :bodant;
            if (BODANT IS NOT NULL) then
                BEGIN
                select max(BODC_COD) from MOVIMIENTO_INVENTARIO where mvin_codigo = :CODIGO and mvin_entrada = 'N'
                    into :ULTBOD;
                if (ULTBOD IS NOT NULL) then
                    BEGIN
                    if (BODANT <> ULTBOD) then
                        begin
                        if (ULTBOD > BODANT) then
                            begin
                            ESTADO = 4; -- No hay una entrada en la bodega previa
                            MENSAJE = 'EL CODIGO ' || :codigo || ' YA SALIO DE LA BODEGA ' || :BODEGA;
                            end
                          else
                            BEGIN
                            ESTADO = 3;  -- No hay enetrada previa
                            MENSAJE = 'EL CODIGO ' || :codigo || ' NO TIENE UNA ENTRADA EN LA BODEGA ' || :BODEGA;
                            end
                        end
                    END
                else
                    begin
                    select MVIN_ID from MOVIMIENTO_INVENTARIO where mvin_codigo = :CODIGO and mvin_entrada = 'S' AND BODC_COD = :bodega
                        INTO :IDMOV;
                    if (IDMOV IS NULL) then
                        BEGIN
                        ESTADO = 3;  -- No hay entrada previa
                        MENSAJE = 'EL CODIGO ' || :codigo || ' NO TIENE UNA ENTRADA EN LA BODEGA ' || :BODEGA;
                        end
                    else
                        estado = 1;  -- OK
                    end
                END
            else
                begin
                ESTADO = 5; -- No hay bodega previa
                MENSAJE = 'NO EXISTE UNA BODEGA PREVIA A ' || :BODEGA;
                end
            end
        end
    end
else
    begin
    ESTADO = 2; -- Codigo incorrecto
    MENSAJE = 'NO SE ENCONTRO EL CODIGO ' || :codigo;
    end
suspend;
end^

SET TERM ; ^

/* Following GRANT statements are generated automatically */

GRANT SELECT ON ARTICULO TO PROCEDURE VALIDE_SALIDA;
GRANT SELECT ON MOVIMIENTO_INVENTARIO TO PROCEDURE VALIDE_SALIDA;
GRANT SELECT ON BODEGA_CONTROL TO PROCEDURE VALIDE_SALIDA;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE VALIDE_SALIDA TO PUBLIC;



