ALTER TABLE ARTICULO
ADD ARTI_MAQUILA T_BOOLEANO;

ALTER TRIGGER ARTICULO_AU INACTIVE;

UPDATE ARTICULO SET ARTI_MAQUILA = 'N' WHERE ARTI_MAQUILA IS NULL;
COMMIT WORK;

ALTER TRIGGER ARTICULO_AU ACTIVE;

INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'PEDIDOS', 'CODIGO COMPANIA PARA REPLICA DE PEDIDO DE PRODUCTOS MAQUILADOS', '', '', 'Indique el codigo de 3 letras de la compania donde se replicara el pedido, si es en otro servidor indique la IP y ruta completa de la compania de destino');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'PEDIDOS', 'CODIGO BODEGA PARA INGRESAR PRODUCTOS MAQUILADOS A COSTO CERO', '01', '', 'Indique el codigo de la bodega que se afectara con la entrada de los productos maquilados a costo cero');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'PEDIDOS', 'PREFIJO DE LA ENTRADA PARA INGRESAR PRODUCTOS MAQUILADOS A COSTO CERO', '01', '', 'Indique el codigo de la bodega que se afectara con la entrada de los productos maquilados a costo cero');
INSERT INTO CONFIGURACION (CONF_MODULO, CONF_CATEGORIA, CONF_PROPIEDAD, CONF_VALOR, CONF_POSIBLES, CONF_AYUDA) VALUES ('FACTURACION', 'PEDIDOS', 'PREFIJO PARA PEDIDO EN COMPANIA DE PRODUCTOS MAQUILADOS', 'PRU', '', 'Indique el codigo de la bodega que se afectara con la entrada de los productos maquilados a costo cero');
COMMIT WORK;

ALTER TABLE PEDIDOS
ADD PEDI_IDPEDM T_ID;

SET TERM ^ ;

CREATE OR ALTER procedure GRABE_PEDIDO_MAQUILA (
    IDP integer)
as
declare variable CIA VARCHAR(200);
declare variable CADSQL VARCHAR(2048);
declare variable TERC_NIT VARCHAR(20);
declare variable VEND_COD INTEGER;
declare variable PEDI_VALIDEZ INTEGER;
declare variable PREF_PRE VARCHAR(4);
declare variable PEDI_FECHA DATE;
declare variable PEDI_NUMERO VARCHAR(6);
declare variable PEDI_DESPACHO VARCHAR(255);
declare variable PEDI_OBS BLOB SUB_TYPE TEXT SEGMENT SIZE 1024;
declare variable PEDI_IVAINC VARCHAR(4);
declare variable PTVT_ID INTEGER;
declare variable PEDI_NOMTERC VARCHAR(60);
declare variable PEDI_DTOPOR NUMERIC(9,2);
declare variable PEDI_DTOMONTO NUMERIC(18,2);
declare variable PEDI_ADICIONAL NUMERIC(18,2);
declare variable PEDI_EXTRA NUMERIC(18,2);
declare variable PEDI_IVAMONTO NUMERIC(18,2);
declare variable PEDI_TOTAL NUMERIC(18,2);
declare variable PEDI_RTFTEPOR NUMERIC(9,4);
declare variable PEDI_RTFTEMONTO NUMERIC(18,2);
declare variable PEDI_RTIVAPOR NUMERIC(9,4);
declare variable PEDI_RTIVAMONTO NUMERIC(18,2);
declare variable PEDI_RTICAPOR NUMERIC(9,4);
declare variable PEDI_RTICAMONTO NUMERIC(18,2);
declare variable PEDI_SUCURSAL VARCHAR(10);
declare variable REGISTRE CHAR(1);
declare variable ARTICULO VARCHAR(20);
declare variable CANT NUMERIC(18,4);
declare variable UNIDAD VARCHAR(8);
declare variable DTOPOR NUMERIC(9, 4);
declare variable DTOMONTO NUMERIC(18, 2);
declare variable IVAPORC NUMERIC(9,4);
declare variable IVAMONTO NUMERIC(18,2);
declare variable CONSUMO NUMERIC(18,2);
declare variable FACTOR NUMERIC(18,2);
declare variable DES VARCHAR(255);
declare variable obs BLOB SUB_TYPE BINARY SEGMENT SIZE 1024;
declare variable TOTAL NUMERIC(18, 2);
declare variable LIPR INTEGER;
declare variable REF VARCHAR(60);
declare variable PRUNIT NUMERIC(18, 2);
declare variable BODE VARCHAR(2);
declare variable item INTEGER;
declare variable cantpr NUMERIC(18, 4);
declare variable IDPED INTEGER;
declare variable IDENTR INTEGER;
declare variable PREFE VARCHAR(4);
begin
EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'PEDIDOS', 'CODIGO COMPANIA PARA REPLICA DE PEDIDO DE PRODUCTOS MAQUILADOS') returning_values (CIA);
if (CIA <> '') then
    BEGIN
    REGISTRE = 'N';
    if (EXISTS (SELECT PD.arti_cod FROM PEDIDOS_DETALLE PD, ARTICULO A WHERE PD.pedi_id = :IDP AND A.arti_cod = PD.arti_cod AND A.arti_maquila = 'S')) then
        REGISTRE = 'S';
    if (EXISTS (SELECT PD.arti_cod FROM PEDIDOS_DETALLE PD, ARTICULOS_PRODUCTO AP, ARTICULO A
        WHERE PD.pedi_id = :IDP AND AP.arti_cod = PD.arti_cod AND AP.arpr_codbar = A.arti_cod AND A.arti_maquila = 'S')) then
        REGISTRE = 'S';
    if (REGISTRE = 'S') then
        BEGIN
        /* REGISTRE EL ENCABEZADO DEL PEDIDO */
        CADSQL = 'EXECUTE PROCEDURE CAMBIE_ID_PEDIDO';
        EXECUTE STATEMENT :CADSQL ON EXTERNAL :CIA INTO :IDPED;

        EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'PEDIDOS', 'PREFIJO PARA PEDIDO EN COMPANIA DE PRODUCTOS MAQUILADOS') returning_values (:PREFE);
        SELECT TERC_NIT, VEND_COD, PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, PEDI_DESPACHO, PEDI_OBS, PEDI_IVAINC, PEDI_NOMTERC,
            PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, PTVT_ID,
            PEDI_RTFTEPORC, PEDI_RTFTEMONTO, PEDI_RTIVAPORC, PEDI_RTIVAMONTO, PEDI_RTICAPORC, PEDI_RTICAMONTO, PEDI_SUCURSAL
            FROM PEDIDOS P WHERE PEDI_ID = :IDP
            INTO :TERC_NIT, :VEND_COD, :PREF_PRE, :PEDI_NUMERO, :PEDI_FECHA, :PEDI_VALIDEZ, :PEDI_DESPACHO, :PEDI_OBS, :PEDI_IVAINC, :PEDI_NOMTERC,
            :PEDI_DTOPOR, :PEDI_DTOMONTO, :PEDI_ADICIONAL, :PEDI_IVAMONTO, :PEDI_EXTRA, :PEDI_TOTAL, :PTVT_ID,
            :PEDI_RTFTEPOR, :PEDI_RTFTEMONTO, :PEDI_RTIVAPOR, :PEDI_RTIVAMONTO, :PEDI_RTICAPOR, :PEDI_RTICAMONTO, :PEDI_SUCURSAL;
        CADSQL = 'INSERT INTO PEDIDOS (PEDI_ID, TERC_NIT, VEND_COD, TIDO_COD, PREF_PRE, PEDI_NUMERO, PEDI_FECHA, PEDI_VALIDEZ, PEDI_DESPACHO, PEDI_OBS, PEDI_IVAINC, PEDI_NOMTERC, ';
        CADSQL = CADSQL || 'PEDI_DTOPOR, PEDI_DTOMONTO, PEDI_ADICIONAL, PEDI_IVAMONTO, PEDI_EXTRA, PEDI_TOTAL, PEDI_ANULADO, PEDI_TRANSMIT, PTVT_ID, PEDI_COTIZACI, PEDI_RTFTEPORC, PEDI_RTFTEMONTO, PEDI_RTIVAPORC, PEDI_RTIVAMONTO, PEDI_RTICAPORC, PEDI_RTICAMONTO, PEDI_RTCREE, PEDI_RTCREEM, PEDI_SUCURSAL) VALUES (';
        CADSQL = CADSQL || :IDPED || ', ''' || :TERC_NIT || ''', ' || :VEND_COD || ', 34, ''' || :PREFE || ''', ''000001'',''';
        CADSQL = CADSQL || :PEDI_FECHA || ''', ' || :PEDI_VALIDEZ || ', ''' || IIF(:PEDI_DESPACHO IS NULL, 'NULL', :PEDI_DESPACHO) || ''', ''' || IIF(:PEDI_OBS IS null, 'NULL', :PEDI_OBS)  || ''', ''' || :PEDI_IVAINC || ''', ''';
        CADSQL = CADSQL || :PEDI_NOMTERC || ''', ' || :PEDI_DTOPOR || ', ' || :PEDI_DTOMONTO || ', ' || :PEDI_ADICIONAL || ', ' || :PEDI_IVAMONTO || ', ';
        CADSQL = CADSQL || :PEDI_EXTRA || ', ' || :PEDI_TOTAL || ', ''N'', ''N'', '|| :PTVT_ID || ', NULL, ' || :PEDI_RTFTEPOR || ', ' || PEDI_RTFTEMONTO || ', ';
        CADSQL = CADSQL || :PEDI_RTIVAPOR || ', ' || PEDI_RTIVAMONTO || ', ' || :PEDI_RTICAPOR || ', ' || PEDI_RTICAMONTO || ', 0, 0,''';
        CADSQL = CADSQL || :pedi_sucursal || ''')';
        EXECUTE STATEMENT :CADSQL ON EXTERNAL :CIA;

        /* GENERE LA ENTRADA */
        identr = gen_id(id_entrada, 1);
        EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'PEDIDOS', 'CODIGO BODEGA PARA INGRESAR PRODUCTOS MAQUILADOS A COSTO CERO') returning_values (:bode);
        EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'PEDIDOS', 'PREFIJO DE LA ENTRADA PARA INGRESAR PRODUCTOS MAQUILADOS A COSTO CERO') returning_values (:PREFE);
        insert into ENTRADAS (ENTR_ID, TIDO_COD, PREF_PRE, ENTR_NUMERO, BODE_COD, ENTR_FECHA, ENTR_CONC,
            ENTR_REFER, ENTR_TIPOREF, ENTR_IDREF, ENTR_IMPTOS, ENTR_NOMTERC, ENTR_ANULADO, ENTR_TRANSMIT, ENTR_OBS, TERC_NIT, NUMOK, ENTR_USUARIO)
            VALUES (:identr, 11, :prefe, '000001', :bode, :pedi_fecha, 'ENTRADA PROD MAQUILADOS ' || :pref_pre || :pedi_numero || '-' || SUBSTRING(:pedi_nomterc FROM 1 FOR 25),
            :pref_pre || :pedi_numero, 34, :idp, 'N', :pedi_nomterc, 'N', 'N', :pedi_obs, :terc_nit, 'N', USER);

        FOR SELECT PD.arti_cod, pede_item, pede_cant, pede_unidad, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC, PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_FACTOR, PEDE_DESC,
            PEDE_OBS, PEDE_TOTAL, LIPR_COD, PEDE_REFERENCIA, PEDE_PRUNIT, BODE_COD
            FROM PEDIDOS_DETALLE PD, ARTICULO A
            WHERE PD.pedi_id = :IDP AND A.arti_cod = PD.arti_cod AND A.arti_maquila = 'S'
            INTO :ARTICULO, :item, :cant, :unidad, :DTOPOR, :DTOMONTO, :IVAPORC, :IVAMONTO, :CONSUMO, :FACTOR, :DES, :obs, :TOTAL, :LIPR, :REF, :PRUNIT, :BODE
            DO
            BEGIN
            CADSQL = 'insert into PEDIDOS_DETALLE (PEDI_ID, PEDE_ITEM, ARTI_COD, PEDE_CANT, PEDE_UNIDAD, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC,';
            CADSQL = CADSQL || 'PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_FACTOR, PEDE_DESC, PEDE_OBS, PEDE_CODBAR, PEDE_TOTAL, PEDE_ANULADO, PEDE_TRANSMIT,';
            CADSQL = CADSQL || 'LIPR_COD, PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_FACTURAD, PEDE_REMISIONAD, BODE_COD) values ('|| :idped || ',';
            CADSQL = CADSQL || :ITEM || ', ''' || :articulo || ''', ' || CANT || ', ''' || :UNIDAD || ''', ' || :DTOPOR || ', ' || :DTOMONTO;
            CADSQL = CADSQL || ', ' || :IVAPORC || ', ' || :IVAMONTO || ', ' || :CONSUMO || ', ' || :FACTOR || ', ''' || :DES || ''', ''' || IIF(:OBS IS NULL, 'NULL', :OBS);
            CADSQL = CADSQL || ''', ''' || :articulo || ''', ' || :TOTAL || ', ''N'', ''N'', ' || :LIPR || ', '''|| IIF(:ref IS NULL, 'NULL', :REF) || ''' , ' || :PRUNIT;
            CADSQL = CADSQL || ', 0, 0, ''' || :bode || ''')';
            EXECUTE STATEMENT :CADSQL ON EXTERNAL :CIA;

            INSERT INTO ENTRADAS_DETALLE (ENTR_ID, ENDE_ITEM, ARTI_COD, BODE_COD, ENDE_CANT, ENDE_UNIDAD, ENDE_COSTO,
                ENDE_LOTE, ENDE_FACTOR, ENDE_DESC, ENDE_OBS, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO,
                ENDE_CONSUMO, ENDE_CODBAR, ENDE_TOTAL, ENDE_ANULADO, ENDE_TRANSMIT, LOTE_VENCE, ENDE_STAND)
                VALUES(:IDENTR, :item, :articulo, :bode, :cant, :unidad, 0,
                NULL, :factor, :des, :obs, 0, 0, 0, 0, 0, :articulo, 0, 'N', 'N', NULL, NULL);
            END
        FOR SELECT AP.arpr_comp, (pede_cant * PEDE_FACTOR), AP.arpr_cant, AP.arpr_unidad, PEDE_DTOPORC, T.taiv_porc, A.arti_consumo,
            A.arti_des, NULL, A.arti_cod, LIPR_COD, PEDE_REFERENCIA, BODE_COD
            FROM PEDIDOS_DETALLE PD, ARTICULOS_PRODUCTO AP, ARTICULO A, TARIFA_IVA T
            WHERE PD.pedi_id = :IDP AND AP.arti_cod = PD.arti_cod AND AP.arpr_codbar = A.arti_cod AND A.arti_maquila = 'S'
            INTO :ARTICULO, :cant, :CANTPR, :unidad, :DTOPOR, :IVAPORC, :CONSUMO, :DES, :obs, :ARTICULO, :LIPR, :REF, :BODE
            DO
            BEGIN
            EXECUTE PROCEDURE FACTOR_UNIDAD_CANT (:ARTICULO, :UNIDAD) returning_values (FACTOR);
            CANTPR = CANTPR * CANT;
            SELECT FIRST 1 PRAR_FIJO, LIPR_COD FROM PRECIOS_ARTICULO WHERE ARTI_COD = :ARTICULO INTO :PRUNIT, :LIPR;
            DTOMONTO = PRUNIT * DTOPOR / 100;
            TOTAL = CANTPR * PRUNIT;
            IVAMONTO = TOTAL * IVAPORC / 100;
            CADSQL = 'insert into PEDIDOS_DETALLE (PEDI_ID, PEDE_ITEM, ARTI_COD, PEDE_CANT, PEDE_UNIDAD, PEDE_DTOPORC, PEDE_DTOMONTO, PEDE_IVAPORC,';
            CADSQL = CADSQL || 'PEDE_IVAMONTO, PEDE_CONSUMO, PEDE_FACTOR, PEDE_DESC, PEDE_OBS, PEDE_CODBAR, PEDE_TOTAL, PEDE_ANULADO, PEDE_TRANSMIT,';
            CADSQL = CADSQL || 'LIPR_COD, PEDE_REFERENCIA, PEDE_PRUNIT, PEDE_FACTURAD, PEDE_REMISIONAD, BODE_COD) values ('|| :idped || ',';
            CADSQL = CADSQL || :ITEM || ', ''' || :articulo || ''', ' || :CANT || ', ''' || :UNIDAD || ''', ' || DTOPOR || ', ' || DTOMONTO;
            CADSQL = CADSQL || ', ' || :IVAPORC || ', ' || :IVAMONTO || ', ' || :CONSUMO || ', ' || :FACTOR || ', ''' || :DES || ''', ''' || :OBS;
            CADSQL = CADSQL || ''', ''' || :ARTICULO || ''', ' || :TOTAL || ', ''N'', ''N'', ' || :LIPR || ', '''|| :ref || ''' , ' || :PRUNIT;
            CADSQL = CADSQL || ', 0, 0, ''' || :bode || ''')';
            EXECUTE STATEMENT :CADSQL ON EXTERNAL :CIA;

            INSERT INTO ENTRADAS_DETALLE (ENTR_ID, ENDE_ITEM, ARTI_COD, BODE_COD, ENDE_CANT, ENDE_UNIDAD, ENDE_COSTO,
                ENDE_LOTE, ENDE_FACTOR, ENDE_DESC, ENDE_OBS, ENDE_DTOPORC, ENDE_DTOMONTO, ENDE_IVAPORC, ENDE_IVAMONTO,
                ENDE_CONSUMO, ENDE_CODBAR, ENDE_TOTAL, ENDE_ANULADO, ENDE_TRANSMIT, LOTE_VENCE, ENDE_STAND)
                VALUES(:IDENTR, :item, :articulo, :bode, :cant, :unidad, 0,
                NULL, :factor, :des, :obs, 0, 0, 0, 0, 0, :articulo, 0, 'N', 'N', NULL, NULL);
            END

        UPDATE PEDIDOS SET PEDI_IDPEDM = :idped WHERE PEDI_ID = :IDP;
        END
    END
end^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE grabe_pedido_maquila TO PUBLIC;

SET TERM ^ ;

CREATE OR ALTER procedure ANULE_PEDIDO_MAQUILA (
    IDP integer)
as
declare variable CIA VARCHAR(200);
declare variable CADSQL VARCHAR(2048);
declare variable IDPM INTEGER;
begin
EXECUTE PROCEDURE lee_configuracion('FACTURACION', 'PEDIDOS', 'CODIGO COMPANIA PARA REPLICA DE PEDIDO DE PRODUCTOS MAQUILADOS') returning_values (CIA);
if (CIA <> '') then
    BEGIN
    SELECT PEDI_IDPEDM FROM PEDIDOS WHERE PEDI_ID = :IDP INTO :IDPM;
    if ((IDPM IS NOT NULL) AND (IDPM <> 0)) then
        BEGIN
        CADSQL = 'UPDATE PEDIDOS SET PEDI_ANULADO = ''S'' WHERE PEDI_ID = ' || :IDPM;
        EXECUTE STATEMENT :CADSQL ON EXTERNAL :CIA;
        END

    UPDATE ENTRADAS SET ENTR_ANULADO = 'S' WHERE ENTR_TIPOREF = 34 AND ENTR_IDREF = :IDP;
    END
end^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE anule_pedido_maquila TO PUBLIC;

