/*==============================================================*/ /* Table: CLIENTES */ /*==============================================================*/ alter table CLIENTES add ENDERECO_COB VARCHAR(40); alter table CLIENTES add NUMERO_COB INTEGER; alter table CLIENTES add BAIRRO_COB VARCHAR(30); alter table CLIENTES add COD_CIDADE_COB SMALLINT; alter table CLIENTES add CEP_COB VARCHAR(10); COMMIT WORK; /*==============================================================*/ /* Table: ITENS_ENTRADA */ /*==============================================================*/ ALTER TABLE ITENS_ENTRADA ADD RAT_ICMS_SUBST NUMERIC(15,2); COMMIT WORK; SET TERM ^; ALTER TRIGGER TG_UPDATE_ENTRADAS ACTIVE BEFORE UPDATE POSITION 0 AS DECLARE VARIABLE varCOD_EMPRESA INTEGER; DECLARE VARIABLE varCOD_CLIENTE INTEGER; DECLARE VARIABLE varDOCUMENTO VARCHAR(20); DECLARE VARIABLE varVLR_RATEIO DECIMAL(15,2); DECLARE VARIABLE varVLR_ICMS DECIMAL(15,2); DECLARE VARIABLE varVLR_IPI DECIMAL(15,2); DECLARE VARIABLE varBASE_ICMS DECIMAL(15,2); DECLARE VARIABLE varRAT_ICMS DECIMAL(15,2); DECLARE VARIABLE varRAT_IPI DECIMAL(15,2); DECLARE VARIABLE varRAT_BASE_ICMS DECIMAL(15,2); DECLARE VARIABLE varSEQUENCIA INTEGER; DECLARE VARIABLE varVLT_TOTAL_ITEM DECIMAL(15,2); BEGIN /* = = Rateia Acrescimos e descontos entre os Itens de Entrada= =*/ IF ((NEW.VLR_TOTAL_MERC IS NOT NULL) AND (NEW.VLR_TOTAL_MERC > 0)) THEN BEGIN UPDATE ITENS_ENTRADA IET SET IET.RAT_VALOR = (NEW.VLR_FRETE * (IET.VLR_TOTAL_ITEM / NEW.VLR_TOTAL_MERC)) + (NEW.VLR_SEGURO * (IET.VLR_TOTAL_ITEM / NEW.VLR_TOTAL_MERC)) + (NEW.VLR_DESPESAS * (IET.VLR_TOTAL_ITEM / NEW.VLR_TOTAL_MERC)) - (NEW.VLR_DESCONTO * (IET.VLR_TOTAL_ITEM / NEW.VLR_TOTAL_MERC)) + (NEW.VLR_ACR_EXTRA * (IET.VLR_TOTAL_ITEM / NEW.VLR_TOTAL_MERC)) - (NEW.VLR_DESC_EXTRA * (IET.VLR_TOTAL_ITEM / NEW.VLR_TOTAL_MERC)) + (NEW.VLR_FRETE_CONH * (IET.VLR_TOTAL_ITEM / NEW.VLR_TOTAL_MERC)) WHERE IET.COD_EMPRESA = NEW.COD_EMPRESA AND IET.COD_CLIENTE = NEW.COD_CLIENTE AND IET.DOCUMENTO = NEW.DOCUMENTO AND IET.TIPO_CONTROL = NEW.TIPO_CONTROL; END /* = = Faz somatorios de valores dos Itens de Entrada e procura o primeiro item= =*/ SELECT IET.COD_EMPRESA, IET.COD_CLIENTE, IET.DOCUMENTO, SUM(IET.RAT_VALOR), MIN(IET.SEQUENCIA), SUM(IET.BASE_ICMS), SUM(IET.VLR_ICMS), SUM(IET.VLR_IPI) FROM ITENS_ENTRADA IET WHERE IET.COD_EMPRESA = NEW.COD_EMPRESA AND IET.COD_CLIENTE = NEW.COD_CLIENTE AND IET.DOCUMENTO = NEW.DOCUMENTO AND IET.TIPO_CONTROL = NEW.TIPO_CONTROL GROUP BY IET.COD_EMPRESA, IET.COD_CLIENTE, IET.DOCUMENTO INTO :varCOD_EMPRESA, :varCOD_CLIENTE, :varDOCUMENTO, :varVLR_RATEIO, :varSEQUENCIA, :varBASE_ICMS, :varVLR_ICMS, :varVLR_IPI; /* = = Calcula a diferenca entre a soma dos Itens de Entrada e o valores Totais na Entrada no Rateio e grava a diferenca no primeiro item de entrada = =*/ UPDATE ITENS_ENTRADA IET SET IET.RAT_VALOR = IET.RAT_VALOR - (:varVLR_RATEIO - (NEW.VLR_FRETE + NEW.VLR_SEGURO + NEW.VLR_DESPESAS + NEW.VLR_FRETE_CONH - NEW.VLR_DESCONTO + NEW.VLR_ACR_EXTRA - NEW.VLR_DESC_EXTRA)) WHERE IET.COD_EMPRESA = NEW.COD_EMPRESA AND IET.COD_CLIENTE = NEW.COD_CLIENTE AND IET.DOCUMENTO = NEW.DOCUMENTO AND IET.TIPO_CONTROL = NEW.TIPO_CONTROL AND IET.SEQUENCIA = :varSEQUENCIA; /* ========= TRATA ICMS ================================================================== */ /* = = Rateia Valores de Icms e Base Icms que alem dos Itens = =*/ IF ((varVLR_ICMS > 0) AND (varBASE_ICMS > 0)) THEN BEGIN UPDATE ITENS_ENTRADA IET SET IET.RAT_ICMS = (NEW.VLR_ICMS - :varVLR_ICMS) * (IET.VLR_ICMS / :varVLR_ICMS), IET.RAT_BASE_ICMS = (NEW.BASE_ICMS - :varBASE_ICMS) * (IET.BASE_ICMS / :varBASE_ICMS) WHERE IET.COD_EMPRESA = NEW.COD_EMPRESA AND IET.COD_CLIENTE = NEW.COD_CLIENTE AND IET.DOCUMENTO = NEW.DOCUMENTO AND IET.TIPO_CONTROL = NEW.TIPO_CONTROL AND IET.VLR_ICMS > 0; END /* = = Faz somatorio do Icms e Base Icms e procura o primeiro item com ICMS = =*/ SELECT IET.COD_EMPRESA, IET.COD_CLIENTE, IET.DOCUMENTO, MIN(IET.SEQUENCIA), SUM(IET.RAT_ICMS), SUM(IET.RAT_BASE_ICMS) FROM ITENS_ENTRADA IET WHERE IET.COD_EMPRESA = NEW.COD_EMPRESA AND IET.COD_CLIENTE = NEW.COD_CLIENTE AND IET.DOCUMENTO = NEW.DOCUMENTO AND IET.TIPO_CONTROL = NEW.TIPO_CONTROL AND IET.VLR_ICMS > 0 GROUP BY IET.COD_EMPRESA, IET.COD_CLIENTE, IET.DOCUMENTO INTO :varCOD_EMPRESA, :varCOD_CLIENTE, :varDOCUMENTO, :varSEQUENCIA, :varRAT_ICMS, :varRAT_BASE_ICMS; /* = = Grava a diferenca no primeiro item de entrada com ICMS= =*/ IF ((varVLR_ICMS > 0) AND (varBASE_ICMS > 0)) THEN BEGIN UPDATE ITENS_ENTRADA IET SET IET.RAT_ICMS = IET.RAT_ICMS + (NEW.VLR_ICMS - (:varRAT_ICMS + :varVLR_ICMS)), IET.RAT_BASE_ICMS = IET.RAT_BASE_ICMS + (NEW.BASE_ICMS - (:varRAT_BASE_ICMS + :varBASE_ICMS)) WHERE IET.COD_EMPRESA = NEW.COD_EMPRESA AND IET.COD_CLIENTE = NEW.COD_CLIENTE AND IET.DOCUMENTO = NEW.DOCUMENTO AND IET.TIPO_CONTROL = NEW.TIPO_CONTROL AND IET.SEQUENCIA = :varSEQUENCIA; END /* ============ TRATA IPI ============================================================= */ /* = = Rateia Valores de IPI que alem dos Itens = =*/ IF (varVLR_IPI > 0) THEN BEGIN UPDATE ITENS_ENTRADA IET SET IET.RAT_IPI = (NEW.VLR_IPI - :varVLR_IPI) * (IET.VLR_IPI / :varVLR_IPI) WHERE IET.COD_EMPRESA = NEW.COD_EMPRESA AND IET.COD_CLIENTE = NEW.COD_CLIENTE AND IET.DOCUMENTO = NEW.DOCUMENTO AND IET.TIPO_CONTROL = NEW.TIPO_CONTROL AND IET.VLR_IPI > 0; END /* = = Faz somatorio do IPI e procura o primeiro item com IPI = =*/ SELECT IET.COD_EMPRESA, IET.COD_CLIENTE, IET.DOCUMENTO, MIN(IET.SEQUENCIA), SUM(IET.RAT_IPI) FROM ITENS_ENTRADA IET WHERE IET.COD_EMPRESA = NEW.COD_EMPRESA AND IET.COD_CLIENTE = NEW.COD_CLIENTE AND IET.DOCUMENTO = NEW.DOCUMENTO AND IET.TIPO_CONTROL = NEW.TIPO_CONTROL AND IET.VLR_IPI > 0 GROUP BY IET.COD_EMPRESA, IET.COD_CLIENTE, IET.DOCUMENTO INTO :varCOD_EMPRESA, :varCOD_CLIENTE, :varDOCUMENTO, :varSEQUENCIA, :varRAT_IPI; /* = = Grava a diferenca no primeiro item de entrada com IPI = =*/ IF (varVLR_IPI > 0) THEN BEGIN UPDATE ITENS_ENTRADA IET SET IET.RAT_IPI = IET.RAT_IPI + (NEW.VLR_IPI - (:varRAT_IPI + :varVLR_IPI)) WHERE IET.COD_EMPRESA = NEW.COD_EMPRESA AND IET.COD_CLIENTE = NEW.COD_CLIENTE AND IET.DOCUMENTO = NEW.DOCUMENTO AND IET.TIPO_CONTROL = NEW.TIPO_CONTROL AND IET.SEQUENCIA = :varSEQUENCIA; END /* == TRATA SUBSTITUIÇÃO TRIBUTÁRIA */ IF (NEW.ICMS_SUBST > 0) THEN BEGIN /* = = Faz somatorios de valores dos Itens de Entrada que tem substituição e procura o primeiro item= =*/ SELECT IET.COD_EMPRESA, IET.COD_CLIENTE, IET.DOCUMENTO, MIN(IET.SEQUENCIA), SUM(IET.VLR_TOTAL_ITEM) FROM ITENS_ENTRADA IET WHERE IET.COD_EMPRESA = NEW.COD_EMPRESA AND IET.COD_CLIENTE = NEW.COD_CLIENTE AND IET.DOCUMENTO = NEW.DOCUMENTO AND IET.TIPO_CONTROL = NEW.TIPO_CONTROL AND (IET.CST_TRIB = '10' OR IET.CST_TRIB = '30' OR IET.CST_TRIB = '60' OR IET.CST_TRIB = '70') GROUP BY IET.COD_EMPRESA, IET.COD_CLIENTE, IET.DOCUMENTO INTO :varCOD_EMPRESA, :varCOD_CLIENTE, :varDOCUMENTO, :varSEQUENCIA, :varVLT_TOTAL_ITEM; /* == Passa todos os itens que tem susbstituição e rateia o valor da mesma*/ UPDATE ITENS_ENTRADA IET SET IET.RAT_ICMS_SUBST = (NEW.ICMS_SUBST * (IET.VLR_TOTAL_ITEM / :varVLT_TOTAL_ITEM)) WHERE IET.COD_EMPRESA = NEW.COD_EMPRESA AND IET.COD_CLIENTE = NEW.COD_CLIENTE AND IET.DOCUMENTO = NEW.DOCUMENTO AND IET.TIPO_CONTROL = NEW.TIPO_CONTROL AND (IET.CST_TRIB = '10' OR IET.CST_TRIB = '30' OR IET.CST_TRIB = '60' OR IET.CST_TRIB = '70'); END END^ SET TERM ;^ COMMIT WORK; /*==============================================================*/ /* Table: MATERIAL_OSP */ /*==============================================================*/ create table MATERIAL_OSP ( COD_EMPRESA SMALLINT not null, NRO_ORDEM INTEGER not null, SEQ_MATERIAL SMALLINT not null, COD_PRODUTO INTEGER, QTD_PROD NUMERIC(9,2), VLR_CUSTO_UNIT NUMERIC(15,2), VLR_CUSTO_TOTAL NUMERIC(15,2), constraint PK_MATERIAL_OSP primary key (COD_EMPRESA, NRO_ORDEM, SEQ_MATERIAL) ); /*==============================================================*/ /* Table: ORDEM_SERVPROD */ /*==============================================================*/ create table ORDEM_SERVPROD ( COD_EMPRESA SMALLINT not null, NRO_ORDEM INTEGER not null, COD_CLIENTE INTEGER, DT_ORDEM DATE, DT_ENTREGA DATE, DESCRICAO VARCHAR(80), OBS BLOB, VLR_PRODUTO NUMERIC(15,2), VLR_SERVICO NUMERIC(15,2), VLR_TOTAL NUMERIC(15,2), constraint PK_ORDEM_SERVPROD primary key (COD_EMPRESA, NRO_ORDEM) ); /*==============================================================*/ /* Table: PRODUTO_OSP */ /*==============================================================*/ create table PRODUTO_OSP ( COD_EMPRESA SMALLINT not null, NRO_ORDEM INTEGER not null, SEQ_PRODUTO SMALLINT not null, COD_PRODUTO INTEGER, DESCR_PROD VARCHAR(50), COMPLTO_PROD VARCHAR(50), QTD_PROD NUMERIC(9,2), VLR_UNIT NUMERIC(15,2), VLR_TOTAL NUMERIC(15,2), constraint PK_PRODUTO_OSP primary key (COD_EMPRESA, NRO_ORDEM, SEQ_PRODUTO) ); /*==============================================================*/ /* Table: SERVICO_OSP */ /*==============================================================*/ create table SERVICO_OSP ( COD_EMPRESA SMALLINT not null, NRO_ORDEM INTEGER not null, SEQ_SERVICO SMALLINT not null, COD_SERVICO SMALLINT, DESCRICAO BLOB, VLR_UNIT NUMERIC(15,2), VLR_TOTAL NUMERIC(15,2), constraint PK_SERVICO_OSP primary key (COD_EMPRESA, NRO_ORDEM, SEQ_SERVICO) ); alter table MATERIAL_OSP add constraint FK_MATERIAL_OSP_ORDEM_SP foreign key (COD_EMPRESA, NRO_ORDEM) references ORDEM_SERVPROD (COD_EMPRESA, NRO_ORDEM); alter table MATERIAL_OSP add constraint FK_MATERIAL_OSP_PRODUTOS foreign key (COD_PRODUTO) references PRODUTOS (COD_PRODUTO); alter table ORDEM_SERVPROD add constraint FK_ORDEM_SERVPROD_CLIENTES foreign key (COD_CLIENTE) references CLIENTES (COD_CLIENTE); alter table ORDEM_SERVPROD add constraint FK_ORDEM_SERVPROD_EMPRESAS foreign key (COD_EMPRESA) references EMPRESAS (COD_EMPRESA); alter table PRODUTO_OSP add constraint FK_PRODUTO_OSP_ORDEM_SP foreign key (COD_EMPRESA, NRO_ORDEM) references ORDEM_SERVPROD (COD_EMPRESA, NRO_ORDEM); alter table PRODUTO_OSP add constraint FK_PRODUTO_OSP_PRODUTOS foreign key (COD_PRODUTO) references PRODUTOS (COD_PRODUTO); alter table SERVICO_OSP add constraint FK_SERVICO_OSP_ORDEM_SP foreign key (COD_EMPRESA, NRO_ORDEM) references ORDEM_SERVPROD (COD_EMPRESA, NRO_ORDEM); alter table SERVICO_OSP add constraint FK_SERVICO_OSP_SERVICOS foreign key (COD_SERVICO) references SERVICOS (COD_SERVICO); COMMIT WORK;