/* SI HAY MONTO DE DESCUENTO PERO NO PORCENTAJE NO AFECTA EL COSTO */

SET TERM ^ ;



CREATE OR ALTER TRIGGER FACTURAS_COMPRA_BI FOR FACTURAS_COMPRA

ACTIVE BEFORE INSERT POSITION 0

AS

declare variable NUMERO VARCHAR(8);

declare variable AUTOM CHAR(1);

declare variable EXISTE CHAR(1);

declare variable PREGTASA CHAR(2);

BEGIN

if (NEW.FACO_SIMPLIFICADO IS NULL) then

    NEW.faco_simplificado = 'N';

/* doble moneda */

if ((NEW.faco_trm IS NULL) or (NEW.faco_trm = 0)) then

    NEW.faco_trm = 1;

/* NO DEJE EN BLANCO EL PORCENTAJE */

if ((NEW.faco_dtomonto <> 0) AND ((NEW.faco_dtoporc = 0) or (NEW.faco_dtoporc IS NULL))) then

    BEGIN

    NEW.faco_dtoporc = (NEW.faco_dtomonto * 100) / (NEW.faco_total - NEW.faco_ivamonto - NEW.faco_adicional + NEW.faco_dtomonto);

    END

EXECUTE PROCEDURE LEE_CONFIGURACION('GENERAL', 'GENERAL', 'PREGUNTAR TASA DE CAMBIO EN DOCUMENTOS DE CUENTAS POR PAGAR') returning_values (:pregtasa);

if (PREGTASA = 'SI') then

    BEGIN

    NEW.faco_dtomonto = NEW.faco_dtomonto * NEW.faco_trm;

    NEW.faco_adicional = NEW.faco_adicional * NEW.faco_trm;

    NEW.faco_extra = NEW.faco_extra * NEW.faco_trm;

    NEW.faco_rtivamonto = NEW.faco_rtivamonto * NEW.faco_trm;

    NEW.faco_rticamonto = NEW.faco_rticamonto * NEW.faco_trm;

    NEW.faco_rtftemonto = NEW.faco_rtftemonto * NEW.faco_trm;

    NEW.faco_ivamonto = NEW.faco_ivamonto * NEW.faco_trm;

    NEW.faco_dtofmonto = NEW.faco_dtofmonto * NEW.faco_trm;

    NEW.faco_total = NEW.faco_total * NEW.faco_trm;

    END

if (NEW.numok = 'N') then

  BEGIN

  /* Actualice el contador del prefijo */

  SELECT PREF_ACTUAL, PREF_AUTO FROM PREFIJOS WHERE TIDO_COD = 21 AND PREF_PRE = NEW.PREF_PRE INTO :NUMERO, :AUTOM;

  /* ACTUALICE EL NUMERO EN COMPROBANTE_ENCABEZADO  */

  if (AUTOM = 'S') then

    BEGIN

    NEW.faco_numero = NUMERO;

    NUMERO = CAST((CAST(NUMERO AS INTEGER) + 1) AS CHAR(6));

    UPDATE PREFIJOS

      SET PREF_ACTUAL = :NUMERO

    WHERE TIDO_COD = 21 AND PREF_PRE = NEW.PREF_PRE;

    END

  ELSE

    BEGIN

    if (CAST(NUMERO AS INTEGER) = CAST(NEW.FACO_NUMERO AS INTEGER)) then

        UPDATE PREFIJOS

          SET PREF_ACTUAL = CAST((CAST(PREF_ACTUAL AS INTEGER) + 1) AS CHAR(6))

        WHERE TIDO_COD = 21 AND PREF_PRE = NEW.PREF_PRE;

    END

  EXECUTE PROCEDURE COMPLETA_CEROS (NEW.FACO_numero) returning_values (NEW.FACO_numero);

  NEW.numok = 'S';

  END

/* Verifique que el numero no existe previamente */

EXISTE = 'N';

SELECT 'S' FROM FACTURAS_COMPRA WHERE PREF_PRE = NEW.PREF_PRE AND FACO_NUMERO = NEW.FACO_NUMERO INTO :EXISTE;

if (EXISTE = 'S') then

    EXCEPTION DOCUMENTO_REGISTRADO 'Ya existe una factura de compra con el número ' || new.pref_pre || new.faco_numero;

END

^



SET TERM ; ^



SET TERM ^ ;



CREATE OR ALTER TRIGGER FACTCOMP_DETALLE_AI FOR FACTURAS_COMPRAS_DETALLE

ACTIVE AFTER INSERT POSITION 0

AS

declare variable fec date;

declare variable fecaux date;

declare variable aux varchar(90);

declare variable CONC VARCHAR(60);

declare variable factor numeric(18,4);

declare variable Pref varchar(4);

declare variable Num varchar(8);

declare variable Nit varchar(20);

declare variable TIPO INTEGER;

declare variable INVFAC CHAR(2);

declare variable IVAINC CHAR(2);

declare variable ICOINC CHAR(2);

declare variable COSTO NUMERIC(18,2);

declare variable NUMPROV VARCHAR(10);

declare variable NUMPED VARCHAR(30);

declare variable NUMREM VARCHAR(30);

declare variable CONSO VARCHAR(2);

declare variable CONSOLIDA INTEGER;

declare variable NUMROWS INTEGER;

declare variable DTOPIE NUMERIC(18,2);

declare variable ADICIONAL NUMERIC(18,2);

declare variable TOTAL NUMERIC(18,2);

declare variable IVAMONTO NUMERIC(18,2);

declare variable EXTRA NUMERIC(18,2);

declare variable FACT NUMERIC(18,4);

declare variable MENORV CHAR(2);

declare variable ACTREM CHAR(2);

declare variable ACTCAN CHAR(2);

declare variable FECREM date;

declare variable IDREM INTEGER;

declare variable ITEREM INTEGER;

declare variable CANTREM NUMERIC(18,4);

declare variable LOTEREM VARCHAR(15);

declare variable PREFREM CHAR(4);

declare variable IDMOV INTEGER;

declare variable DTOPOR NUMERIC(18,4);

declare variable CONFEXIS VARCHAR(20);

declare variable BOD VARCHAR(2);

declare variable MERMAENT CHAR(1);

declare variable MERMAPOR NUMERIC(9,4);

declare variable IDSAL INTEGER;

declare variable PREFSAL VARCHAR(4);

declare variable UNIART VARCHAR(8);

declare variable CANTAUX numeric(18,4);

declare variable CANT numeric(18,4);

declare variable ITEM integer;

BEGIN

if ((NEW.faco_id <> 0) and (new.fcde_anulado = 'N')) then

    BEGIN

    select faco_fecha, pref_pre, faco_numero, terc_nit, faco_imptos, faco_numprov, faco_remision, faco_orden, FACO_CONSOLIDA,

        FACO_TOTAL, FACO_EXTRA, FACO_IVAMONTO, FACO_ADICIONAL, FACO_DTOMONTO, FACO_DTOPORC

        from facturas_compra where faco_id = new.faco_id

        into :fec, :Pref, :Num, :Nit, :ivainc, :numprov, :numrem, :numped, :CONSOLIDA,

        :total, :extra, :ivamonto, :adicional, :dtopie, :dtopor;

    conc = 'FACTURA COMPRA No.' || PREF || NUM || '-' || NUMPROV;

    if (NUMREM <> '') then

        BEGIN

        AUX = SUBSTR(NUMREM, 1, 15);

        conc = conc || '-REM:' || AUX;

        END

    else

        if (NUMPED <> '') then

            BEGIN

            AUX = SUBSTR(NUMPED, 1, 15);

            conc = conc || '-ORDEN ' || AUX;

            END

    SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;

    if (Tipo is null) then

        Tipo = 0;

    execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);

    execute procedure factor_unidad_cant(new.arti_cod, new.fcde_unidad) returning_values(factor);

    COSTO = ((new.fcde_prunit - NEW.fcde_dtomonto) / :factor);

    if (IVAINC = 'S') then

        BEGIN

        EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);

        if (icoinc = 'SI') then

            COSTO = COSTO - (NEW.fcde_consumo/(NEW.fcde_cant * new.fcde_factor));

        COSTO = COSTO / (1 + NEW.fcde_ivaporc/100);

        END

    EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);

    if (MENORV = 'SI') then

        BEGIN

        FACT = (TOTAL - EXTRA - IVAMONTO);

        if ((FACT - ADICIONAL + DTOPIE) <> 0) then

            FACT = FACT / (FACT - ADICIONAL + DTOPIE);

        ELSE

            FACT = 1;

        COSTO = COSTO * FACT;

        END

    /* si se hizo con base en una remision no afecte inventario */

    if (INVFAC = 'SI') then

      if (Tipo <> 22) then

        begin

        INSERT INTO MOVIMIENTO_ARTICULO

          (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)

          VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 21, NEW.faco_id,

          :CONC, :factor * new.fcde_cant, :COSTO, 'S', new.fcde_lote, :Pref, :Num, NEW.fcde_item, :Nit);



        if (COSTO > 0 ) then

         BEGIN

          /* ACTUALICE EL COSTO POR PROVEEDOR */

          SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO

            WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD

            INTO :FECAUX;

          if (FECAUX IS NULL) then

            INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)

                VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);

          else

            UPDATE PROVEEDOR_ARTICULO

                SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov

                WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;

         END

        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */

        EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);

        END /* AFECTAR INV */

    EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);

    if ((ACTREM = 'SI') and (Tipo = 22)) then

        BEGIN

        numrows = 0;

        for select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, BODE_COD

            from movimiento_articulo M, consolidado_faltantes C

            where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod and m.mvar_item = c.cofa_itemori

            into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem, :BOD

            do

            begin

            if (numrows <> 0) then

                BEGIN

                /* inserte primero para evitar existencias negativas */

                IDMOV = GEN_ID(ID_MOVARTI,1);

                EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR CANTIDADES DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTCAN);

                if (ACTCAN = 'SI') then

                    CANTREM = NEW.fcde_cant * NEW.fcde_factor;

                INSERT INTO MOVIMIENTO_ARTICULO

                    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)

                    VALUES(NEW.ARTI_COD, :IDMOV, :BOD, :fecrem, 22, :idrem,

                    :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);

                SELECT CONF_VALOR FROM configuracion WHERE CONF_MODULO = 'INVENTARIO' AND CONF_CATEGORIA = 'EXISTENCIAS' AND CONF_PROPIEDAD = 'ACCION A TOMAR SI LA EXISTENCIA ES INSUFICIENTE' INTO :confexis;

                update CONFIGURACION SET CONF_VALOR = 'IGNORAR' WHERE CONF_MODULO = 'INVENTARIO' AND CONF_CATEGORIA = 'EXISTENCIAS' AND CONF_PROPIEDAD = 'ACCION A TOMAR SI LA EXISTENCIA ES INSUFICIENTE';

                DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;

                /* reponga el consecutivo para no afectar el orden del kardex */

                update MOVIMIENTO_ARTICULO set mvar_cons = :numrows WHERE MVAR_CONS = :idmov;

                update costos set cost_idmov = :numrows WHERE cost_idmov = :idmov AND arti_cod = new.arti_cod;

                update CONFIGURACION SET CONF_VALOR = :confexis WHERE CONF_MODULO = 'INVENTARIO' AND CONF_CATEGORIA = 'EXISTENCIAS' AND CONF_PROPIEDAD = 'ACCION A TOMAR SI LA EXISTENCIA ES INSUFICIENTE';



                if (COSTO > 0 ) then

                    BEGIN

                    /* ACTUALICE EL COSTO POR PROVEEDOR */

                    SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO

                        WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD

                        INTO :FECAUX;

                    if (FECAUX IS NULL) then

                        INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)

                            VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);

                    else

                        UPDATE PROVEEDOR_ARTICULO

                            SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov

                            WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;

                    END

                /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */

                EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);

                END

            END

        END



    /* ACTUALICE EL PENDIENTE  */

    if (CONSOLIDA <> 0) then

        BEGIN

        execute procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);

        if (CONSO = 'NO') then

            update consolidado_faltantes set COFA_IDDES = new.faco_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec

                where COFA_ID = :consolida AND ARTI_COD = NEW.ARTI_COD;

        else

            begin

            CANTAUX = new.fcde_cant * new.fcde_factor;

            for select COFA_ITEM, ((COFA_CANT * COFA_FACTOR)-COFA_CANTCR) from consolidado_faltantes

                where COFA_ID = :CONSOLIDA and ARTI_COD = new.ARTI_COD

                into :ITEM, :CANT

                do

                begin

                if ((CANTAUX > 0) and (CANT > 0))then

                    if (CANT < CANTAUX) then

                        begin

                        update consolidado_faltantes

                            set COFA_IDDES = new.faco_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec

                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;

                        CANTAUX = CANTAUX - CANT;

                        end

                    else

                        begin

                        update consolidado_faltantes

                            set COFA_IDDES = new.faco_id, COFA_CANTCR = COFA_CANTCR + :CANTAUX, COFA_FECDES = :fec

                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;

                        CANTAUX = 0;

                        end

                end

            end

        END

    /* ACTUALICE EL STAND */

    if (new.fcde_stand is not null) then

      if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then

        UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;

      else

        INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);

    /* SI MERMA ALMACENAMIENTO */

    SELECT ARTI_MERMAENT, ARTI_MERMAPOR, ARTI_UNIDAD FROM ARTICULO

        WHERE ARTI_COD = NEW.arti_cod INTO :mermaent, :mermapor, :uniart;

    if (MERMAENT = 'S') then

        BEGIN

        EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'SALIDAS', 'PREFIJO PARA SALIDAS POR MERMA DE ALMACENAMIENTO') returning_values (:prefsal);

        IDSAL = gen_id(id_salida, 1);

        INSERT INTO SALIDAS (SALI_ID, TIDO_COD, PREF_PRE, BODE_COD, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, SALI_TIPOREF, SALI_IDREF, SALI_IMPTOS,

            SALI_NOMTERC, SALI_ANULADO, SALI_TRANSMIT, SALI_OBS, TERC_NIT, SALI_RESERVA, SALI_RESEID, SALI_USUARIO, NUMOK)

            VALUES (:idsal, 12, :prefsal, NEW.bode_cod, '000001', :fec, 'SALIDA MERMA ALMACENAMIENTO EN COMPRA ' || :pref || :num, :numprov, 21, NEW.faco_id, 'N',

            NULL, 'N', 'N', NULL, NULL, NULL, NULL, USER, 'N');

        INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,

            SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)

            VALUES (:IDSAL, 1, NEW.arti_cod, NEW.bode_cod, (NEW.fcde_cant * NEW.fcde_factor * :MERMAPOR / 100), :uniart, NEW.fcde_lote, 1,

            NEW.fcde_desc, NULL, NEW.fcde_ivaporc, 0, 0, NEW.fcde_codbar, 'N', 0, 0, 'N');

        END

    END

END

^



SET TERM ; ^



SET TERM ^ ;



CREATE OR ALTER TRIGGER FACTCOMP_DETALLE_AU FOR FACTURAS_COMPRAS_DETALLE

ACTIVE AFTER UPDATE POSITION 0

as

declare variable fec date;

declare variable fecaux date;

declare variable AUX varchar(90);

declare variable CONC VARCHAR(60);

declare variable Pref varchar(4);

declare variable Num varchar(8);

declare variable Nit varchar(20);

declare variable factor numeric(18,4);

declare variable TIPO INTEGER;

declare variable INVFAC CHAR(2);

declare variable IVAINC CHAR(2);

declare variable ICOINC CHAR(2);

declare variable COSTO NUMERIC(18,2);

declare variable NUMPROV VARCHAR(10);

declare variable NUMPED VARCHAR(30);

declare variable NUMREM VARCHAR(30);

declare variable CONSO VARCHAR(2);

declare variable CONSOLIDA INTEGER;

declare variable NUMROWS INTEGER;

declare variable DTOPIE NUMERIC(18,2);

declare variable ADICIONAL NUMERIC(18,2);

declare variable TOTAL NUMERIC(18,2);

declare variable IVAMONTO NUMERIC(18,2);

declare variable EXTRA NUMERIC(18,2);

declare variable FACT NUMERIC(18,4);

declare variable MENORV CHAR(2);

declare variable ACTREM CHAR(2);

declare variable ACTCAN CHAR(2);

declare variable FECREM date;

declare variable IDREM INTEGER;

declare variable ITEREM INTEGER;

declare variable CANTREM NUMERIC(18,4);

declare variable LOTEREM VARCHAR(15);

declare variable PREFREM CHAR(4);

declare variable IDMOV INTEGER;

declare variable DTOPOR NUMERIC(18,4);

declare variable CONFEXIS VARCHAR(20);

declare variable BOD VARCHAR(2);

declare variable MERMAENT CHAR(1);

declare variable MERMAPOR NUMERIC(9,4);

declare variable IDSAL INTEGER;

declare variable PREFSAL VARCHAR(4);

declare variable UNIART VARCHAR(8);

declare variable CANTAUX numeric(18,4);

declare variable CANT numeric(18,4);

declare variable ITEM integer;

BEGIN

if (old.fcde_devuelto = new.fcde_devuelto) then

    begin

    /* deshaga lo viejo */

    if ((old.fcde_anulado = 'N') and (OLD.faco_id <> 0)) then

        begin

        select faco_fecha, faco_consolida from facturas_compra where faco_id = old.faco_id into :fec, :consolida;

        DELETE FROM MOVIMIENTO_ARTICULO WHERE (mvar_tipodoc = 21) and (mvar_idref = old.faco_id) and (mvar_item = old.fcde_item);

        DELETE FROM SALIDAS WHERE SALI_TIPOREF = 21 AND SALI_IDREF = OLD.faco_id;

        /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */

        EXECUTE PROCEDURE CALCULA_PRECIOS(old.ARTI_COD, :FEC);

        /* LOS PENDIENTES */

        if (CONSOLIDA <> 0) then

            BEGIN

            CANTAUX = old.fcde_cant * old.fcde_factor;

            for select COFA_ITEM, COFA_CANTCR from consolidado_faltantes

                where COFA_ID = :CONSOLIDA and ARTI_COD = old.ARTI_COD

                into :ITEM, :CANT

                do

                begin

                if ((CANTAUX > 0) and (CANT > 0))then

                    begin

                    if (CANTAUX > CANT) then

                        BEGIN

                        update consolidado_faltantes

                            set COFA_IDDES = 0, COFA_CANTCR = 0

                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;

                        CANTAUX = CANTAUX - CANT;

                        END

                    ELSE

                        BEGIN

                        update consolidado_faltantes

                            set COFA_IDDES = 0, COFA_CANTCR = COFA_CANTCR - :CANTAUX

                            where COFA_ID = :consolida and COFA_ITEM = :ITEM;

                        CANTAUX = 0;

                        END

                    end

                end

            END

        end

    /* Registre el nuevo */

    if ((new.fcde_anulado = 'N') and (new.faco_id <> 0)) then

        BEGIN

        select faco_fecha, pref_pre, faco_numero, terc_nit, faco_imptos, faco_numprov, faco_remision, faco_orden,

            faco_consolida, faco_dtomonto, faco_adicional, faco_total, faco_ivamonto, faco_extra, FACO_DTOPORC

            from facturas_compra where faco_id = new.faco_id

            into :fec, :Pref, :Num, :Nit, :ivainc, :numprov, :numrem, :numped,

            :consolida, :dtopie, :adicional, :total, :ivamonto, :extra, :dtopor;

        conc = 'FACTURA COMPRA No.' || PREF || NUM || '-' || NUMPROV;

        if (NUMREM <> '') then

            BEGIN

            AUX = SUBSTR(NUMREM, 1, 15);

            conc = conc || '-REM:' || AUX;

            END

        else

            if (NUMPED <> '') then

                BEGIN

                AUX = SUBSTR(NUMPED, 1, 15);

                conc = conc || '-ORDEN ' || AUX;

                END

        SELECT MAX(CEFA_TIPOORI) FROM consolide_faltantes WHERE CEFA_ID = :CONSOLIDA INTO :TIPO;

        if (Tipo is null) then

            Tipo = 0;

        execute procedure lee_configuracion('COMPRAS', 'FACTURAS', 'AFECTAR INVENTARIO CON LA FACTURA') returning_values (:INVFAC);

        /* si se hizo con base en una remision no afecte inventario */

        if ((Tipo <> 22) and (INVFAC = 'SI')) then

            begin

            execute procedure factor_unidad_cant(new.arti_cod, new.fcde_unidad) returning_values(factor);

            COSTO = ((new.fcde_prunit - NEW.fcde_dtomonto) / :factor);

            if (IVAINC = 'S') then

                BEGIN

                EXECUTE PROCEDURE lee_configuracion ('FACTURACION', 'ARTICULOS', 'IMPOCONSUMO INCLUIDO EN EL PRECIO BASE DE VENTA ANTES DE IVA') returning_values(:icoinc);

                if (icoinc = 'SI') then

                    COSTO = COSTO - (NEW.fcde_consumo/(NEW.fcde_cant * new.fcde_factor));

                COSTO = COSTO / (1 + NEW.fcde_ivaporc/100);

                END

            EXECUTE PROCEDURE lee_configuracion('COMPRAS','FACTURAS','DESCUENTO Y VALOR ADICIONAL DEL DOCUMENTO COMO MENOR VALOR DEL COSTO') returning_values (:MENORV);

            if (MENORV = 'SI') then

                BEGIN

                FACT = (TOTAL - EXTRA - IVAMONTO);

                if ((FACT - ADICIONAL + DTOPIE) <> 0) then

                    FACT = FACT / (FACT - ADICIONAL + DTOPIE);

                ELSE

                    FACT = 1;

                COSTO = COSTO * FACT;

                END

            INSERT INTO MOVIMIENTO_ARTICULO

                (ARTI_COD, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)

                VALUES(NEW.ARTI_COD, NEW.BODE_COD, :FEC, 21, NEW.faco_id,

                :CONC, :factor * new.fcde_cant, :COSTO, 'S', new.fcde_lote, :Pref, :Num, NEW.fcde_item, :Nit);

            if (COSTO > 0 ) then

             BEGIN

              /* ACTUALICE EL COSTO POR PROVEEDOR */

              SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO

                WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD INTO :FECAUX;

              if (FECAUX IS NULL) then

                INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)

                    VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);

              else

                UPDATE PROVEEDOR_ARTICULO

                    SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov

                    WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;

             END

            /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */

            EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);

            end

        EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR COSTOS DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTREM);

        if ((ACTREM = 'SI') and (Tipo = 22)) then

            BEGIN

            numrows = 0;

            for select mvar_cons, MVAR_ITEM, MVAR_FECHA, MVAR_IDREF, MVAR_CANT, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, BODE_COD

                from movimiento_articulo M, consolidado_faltantes C

                where C.cofa_id = :CONSOLIDA AND mvar_tipodoc = 22 and mvar_idref = C.cofa_idori AND C.cofa_tipoori = 22 and m.arti_cod = new.arti_cod

                into :numrows, :iterem, :fecrem, :idrem, :cantrem, :loterem, :prefrem, :numrem, :BOD

                do

                BEGIN

                /* inserte primero para evitar existencias negativas */

                IDMOV = GEN_ID(ID_MOVARTI,1);

                EXECUTE PROCEDURE lee_configuracion('COMPRAS', 'FACTURAS', 'ACTUALIZAR CANTIDADES DE LA REMISION RELACIONADA AL GRABAR LA FACTURA') returning_values (:ACTCAN);

                if (ACTCAN = 'SI') then

                    CANTREM = NEW.fcde_cant * NEW.fcde_factor;

                INSERT INTO MOVIMIENTO_ARTICULO

                    (ARTI_COD, MVAR_CONS, BODE_COD, MVAR_FECHA, MVAR_TIPODOC, MVAR_IDREF, MVAR_CONC, MVAR_CANT, MVAR_COSTO, MVAR_ENTRADA, MVAR_LOTE, MVAR_PREF, MVAR_NUMERO, MVAR_ITEM, TERC_NIT)

                    VALUES(NEW.ARTI_COD, :IDMOV, :bod, :fecrem, 22, :idrem,

                    :CONC, :cantrem, :costo, 'S', :loterem, :prefrem, :numrem, :iterem, :Nit);

                SELECT CONF_VALOR FROM configuracion WHERE CONF_MODULO = 'INVENTARIO' AND CONF_CATEGORIA = 'EXISTENCIAS' AND CONF_PROPIEDAD = 'ACCION A TOMAR SI LA EXISTENCIA ES INSUFICIENTE' INTO :confexis;

                update CONFIGURACION SET CONF_VALOR = 'IGNORAR' WHERE CONF_MODULO = 'INVENTARIO' AND CONF_CATEGORIA = 'EXISTENCIAS' AND CONF_PROPIEDAD = 'ACCION A TOMAR SI LA EXISTENCIA ES INSUFICIENTE';

                DELETE FROM MOVIMIENTO_ARTICULO WHERE MVAR_CONS = :numrows;

                /* reponga el consecutivo para no afectar el orden del kardex */

                update MOVIMIENTO_ARTICULO set mvar_cons = :numrows WHERE MVAR_CONS = :idmov;

                update costos set cost_idmov = :numrows WHERE cost_idmov = :idmov AND arti_cod = new.arti_cod;

                update CONFIGURACION SET CONF_VALOR = :confexis WHERE CONF_MODULO = 'INVENTARIO' AND CONF_CATEGORIA = 'EXISTENCIAS' AND CONF_PROPIEDAD = 'ACCION A TOMAR SI LA EXISTENCIA ES INSUFICIENTE';



                if (COSTO > 0 ) then

                    BEGIN

                    /* ACTUALICE EL COSTO POR PROVEEDOR */

                    SELECT PVAR_FECHA FROM PROVEEDOR_ARTICULO

                        WHERE TERC_NIT = :Nit AND ARTI_COD = NEW.ARTI_COD

                        INTO :FECAUX;

                    if (FECAUX IS NULL) then

                        INSERT INTO PROVEEDOR_ARTICULO (TERC_NIT, ARTI_COD, PVAR_COSTO, PVAR_FECHA, PVAR_COD,PVAR_DES)

                            VALUES (:Nit, NEW.ARTI_COD, :COSTO, :fec, NEW.fcde_codprov,NEW.fcde_desc);

                    else

                        UPDATE PROVEEDOR_ARTICULO

                            SET PVAR_COSTO = :COSTO, PVAR_FECHA = :fec, PVAR_COD = NEW.fcde_codprov

                            WHERE ARTI_COD = NEW.ARTI_COD AND TERC_NIT = :Nit;

                    END

                /* RECORRA LAS LISTAS DE PRECIOS Y CAMBIE EL PRECIO */

                EXECUTE PROCEDURE CALCULA_PRECIOS(NEW.ARTI_COD, :FEC);

                END

            END



        if (CONSOLIDA <> 0) then

            begin

            execute procedure LEE_CONFIGURACION ('COMPRAS','DOCUMENTOS','DEJAR PENDIENTES LOS ARTICULOS NO INCLUIDOS AL TRAER DOCUMENTOS RELACIONADOS') returning_values (CONSO);

            if (CONSO = 'NO') then

                update consolidado_faltantes set COFA_IDDES = new.faco_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec

                    where COFA_ID = :consolida AND ARTI_COD = NEW.ARTI_COD;

            else

                begin

                CANTAUX = new.fcde_cant * new.fcde_factor;

                for select COFA_ITEM, ((COFA_CANT * COFA_FACTOR)-COFA_CANTCR) from consolidado_faltantes

                    where COFA_ID = :CONSOLIDA and ARTI_COD = new.ARTI_COD

                    into :ITEM, :CANT

                    do

                    begin

                    if ((CANTAUX > 0) and (CANT > 0))then

                        if (CANT < CANTAUX) then

                            begin

                            update consolidado_faltantes

                                set COFA_IDDES = new.faco_id, COFA_CANTCR = COFA_CANT * COFA_FACTOR, COFA_FECDES = :fec

                                where COFA_ID = :consolida and COFA_ITEM = :ITEM;

                            CANTAUX = CANTAUX - CANT;

                            end

                        else

                            begin

                            update consolidado_faltantes

                                set COFA_IDDES = new.faco_id, COFA_CANTCR = COFA_CANTCR + :CANTAUX, COFA_FECDES = :fec

                                where COFA_ID = :consolida and COFA_ITEM = :ITEM;

                            CANTAUX = 0;

                            end

                    end

                end

            end

        /* ACTUALICE EL STAND */

        if (new.fcde_stand is not null) then

          if (exists(select stand_cod from stands where arti_cod = new.arti_cod and stand_bodega = new.bode_cod)) then

            UPDATE stands set stand_cod = new.fcde_stand where arti_cod = new.arti_cod and stand_bodega = new.bode_cod;

          else

            INSERT INTO stands (ARTI_COD, STAND_BODEGA, STAND_COD) VALUES (NEW.arti_cod, NEW.bode_cod, NEW.fcde_stand);

        /* SI MERMA ALMACENAMIENTO */

        SELECT ARTI_MERMAENT, ARTI_MERMAPOR, ARTI_UNIDAD FROM ARTICULO

            WHERE ARTI_COD = NEW.arti_cod INTO :mermaent, :mermapor, :uniart;

        if (MERMAENT = 'S') then

            BEGIN

            EXECUTE PROCEDURE lee_configuracion('INVENTARIO', 'SALIDAS', 'PREFIJO PARA SALIDAS POR MERMA DE ALMACENAMIENTO') returning_values (:prefsal);

            IDSAL = gen_id(id_salida, 1);

            INSERT INTO SALIDAS (SALI_ID, TIDO_COD, PREF_PRE, BODE_COD, SALI_NUMERO, SALI_FECHA, SALI_CONC, SALI_REFER, SALI_TIPOREF, SALI_IDREF, SALI_IMPTOS,

                SALI_NOMTERC, SALI_ANULADO, SALI_TRANSMIT, SALI_OBS, TERC_NIT, SALI_RESERVA, SALI_RESEID, SALI_USUARIO, NUMOK)

                VALUES (:idsal, 12, :prefsal, NEW.bode_cod, '000001', :fec, 'SALIDA MERMA ALMACENAMIENTO EN COMPRA ' || :pref || :num, :numprov, 21, NEW.faco_id, 'N',

                NULL, 'N', 'N', NULL, NULL, NULL, NULL, USER, 'N');

            INSERT INTO SALIDAS_DETALLE (SALI_ID, SADE_ITEM, ARTI_COD, BODE_COD, SADE_CANT, SADE_UNIDAD, SADE_LOTE, SADE_FACTOR,

                SADE_DESC, SADE_OBS, SADE_IVAPORC, SADE_IVAMONTO, SADE_CONSUMO, SADE_CODBAR, SADE_ANULADO, SADE_COSTO, SADE_TOTAL, SADE_TRANSMIT)

                VALUES (:IDSAL, 1, NEW.arti_cod, NEW.bode_cod, (NEW.fcde_cant * NEW.fcde_factor * :MERMAPOR / 100), :uniart, NEW.fcde_lote, 1,

                NEW.fcde_desc, NULL, NEW.fcde_ivaporc, 0, 0, NEW.fcde_codbar, 'N', 0, 0, 'N');

            END

        END

    end

END

^



SET TERM ; ^







