SET TERM ^ ;

CREATE OR ALTER TRIGGER MOVIMIENTO_INVENTARIO_BI FOR MOVIMIENTO_INVENTARIO
ACTIVE BEFORE INSERT POSITION 0
as
declare variable DESCRIPCION VARCHAR(300);
begin
new.mvin_id = gen_id(id_movinv, 1);
if (char_length(new.mvin_codigo) > 9) then
    begin
    new.mvin_articulo = LEFT(new.mvin_codigo,  char_length(new.mvin_codigo)-9);
    DESCRIPCION = NULL;
    SELECT ARTI_DES FROM ARTICULO WHERE ARTI_COD = new.mvin_articulo INTO :DESCRIPCION;
    if (DESCRIPCION IS NULL) then
        BEGIN
        /* INTENTE COMO ARTICULO DIRECTO */
        SELECT ARTI_DES FROM ARTICULO WHERE ARTI_COD = NEW.mvin_codigo INTO :DESCRIPCION;
        if (DESCRIPCION IS NULL) then
            exception articulo_no_existe 'NO SE ENCONTRO UN ARTICULO CON EL CODIGO ' || NEW.mvin_codigo;
        ELSE
            NEW.mvin_articulo = NEW.mvin_codigo;
        END
    end
else    
    begin
    SELECT ARTI_DES FROM ARTICULO WHERE ARTI_COD = NEW.mvin_codigo INTO :DESCRIPCION;
    if (DESCRIPCION IS NULL) then
        exception articulo_no_existe 'NO SE ENCONTRO UN ARTICULO CON EL CODIGO ' || NEW.mvin_codigo;
    ELSE
        NEW.mvin_articulo = NEW.mvin_codigo;
    end
new.mvin_fecha = current_timestamp;
end^

SET TERM ; ^

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
                    else
                        ESTADO = 1;  -- OK
                    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 ; ^



