ALTER TABLE TBUNIDADEMEDIDA
    ADD DESCRICAO_ALT VARCHAR(10) CHARACTER SET UTF8 COLLATE UTF8;

COMMENT ON COLUMN TBUNIDADEMEDIDA.DESCRICAO_ALT IS
'Descição Alternativa para Uso na Unidade de Medida Alternativa';

SET TERM ^ ;

CREATE OR ALTER trigger ttbunidademedida_b01u for tbunidademedida
active before update position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF ( OLD.descricao <> NEW.descricao) THEN
    BEGIN
        HISTORICO = HISTORICO||'Descricao:'|| OLD.descricao||'->'||NEW.descricao;
    END
    
    IF ( OLD.status <> NEW.status) THEN
    BEGIN
        HISTORICO = HISTORICO||', Status:'|| OLD.status||'->'||NEW.status;
    END
    
    IF ( OLD.SIGLA <> NEW.SIGLA) THEN
    BEGIN
        HISTORICO = HISTORICO||', Sigla:'|| OLD.SIGLA||'->'||NEW.SIGLA;
    END
    
    IF ( OLD.PODE_FRACIONAR <> NEW.PODE_FRACIONAR) THEN
    BEGIN
        HISTORICO = HISTORICO||', Fracionar:'|| OLD.PODE_FRACIONAR||'->'||NEW.PODE_FRACIONAR;
    END

    IF ( OLD.DESCRICAO_ALT <> NEW.DESCRICAO_ALT) THEN
    BEGIN
        HISTORICO = HISTORICO||', Desc.Alternativa:'|| OLD.DESCRICAO_ALT||'->'||NEW.DESCRICAO_ALT;
    END
    
    
    IF ( OLD.STATUSEXCLUSAO <> NEW.STATUSEXCLUSAO and new.STATUSEXCLUSAO = 0) THEN
    BEGIN
        HISTORICO = 'Registro Excluido';
    END
    
    IF ( OLD.STATUSEXCLUSAO <> NEW.STATUSEXCLUSAO and new.STATUSEXCLUSAO = 1) THEN
    BEGIN
        HISTORICO = 'Exclusão desfeita';
    END
    
    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBUNIDADEMEDIDA',NEW.id, HISTORICO);
    END
end
^

SET TERM ; ^

/******************************************************************************/
/******************************************************************************/
/******************************************************************************/

/******************************************************************************/
/****                                Tables                                ****/
/******************************************************************************/


CREATE GENERATOR GTBUNIDADEMEDIDA_TEMP;

CREATE TABLE TBUNIDADEMEDIDA_TEMP (
    SIGLA           VARCHAR(3) NOT NULL,
    DESCRICAO       VARCHAR(50),
    STATUS          CHAR(1) DEFAULT '1',
    STATUSEXCLUSAO  CHAR(1) DEFAULT '0',
    USUARIO_CODIGO  INTEGER,
    DATA            DATE DEFAULT 'NOW',
    ID              INTEGER,
    PODE_FRACIONAR  CHAR(1) DEFAULT '1',
    IMPORTADO       CHAR(1) DEFAULT '0',
    DESCRICAO_ALT   VARCHAR(10)
);




/******************************************************************************/
/****                             Primary keys                             ****/
/******************************************************************************/

ALTER TABLE TBUNIDADEMEDIDA_TEMP ADD PRIMARY KEY (SIGLA);


/******************************************************************************/
/****                               Triggers                               ****/
/******************************************************************************/



SET TERM ^ ;



/******************************************************************************/
/****                         Triggers for tables                          ****/
/******************************************************************************/



/* Trigger: TTBUNIDADE_TEMP_B01D */
CREATE OR ALTER TRIGGER TTBUNIDADE_TEMP_B01D FOR TBUNIDADEMEDIDA_TEMP
ACTIVE BEFORE DELETE POSITION 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF ( OLD.id > 0) THEN
    BEGIN
        HISTORICO = HISTORICO||'Registro Excluido';
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBUNIDADEMEDIDA_TEMP',old.id, HISTORICO);
    END
end
^


/* Trigger: TTBUNIDADE_TEMP_B01I */
CREATE OR ALTER TRIGGER TTBUNIDADE_TEMP_B01I FOR TBUNIDADEMEDIDA_TEMP
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF ( NEW.id > 0) THEN
    BEGIN
        HISTORICO = HISTORICO||' Registro Incluido';
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBUNIDADEMEDIDA_TEMP',NEW.id, HISTORICO);
    END
end
^


/* Trigger: TTBUNIDADE_TEMP_B01U */
CREATE OR ALTER TRIGGER TTBUNIDADE_TEMP_B01U FOR TBUNIDADEMEDIDA_TEMP
ACTIVE BEFORE UPDATE POSITION 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF ( OLD.descricao <> NEW.descricao) THEN
    BEGIN
        HISTORICO = HISTORICO||'Descricao:'|| OLD.descricao||'->'||NEW.descricao;
    END
    
    IF ( OLD.status <> NEW.status) THEN
    BEGIN
        HISTORICO = HISTORICO||', Status:'|| OLD.status||'->'||NEW.status;
    END
    
    IF ( OLD.SIGLA <> NEW.SIGLA) THEN
    BEGIN
        HISTORICO = HISTORICO||', Sigla:'|| OLD.SIGLA||'->'||NEW.SIGLA;
    END
    
    IF ( OLD.PODE_FRACIONAR <> NEW.PODE_FRACIONAR) THEN
    BEGIN
        HISTORICO = HISTORICO||', Fracionar:'|| OLD.PODE_FRACIONAR||'->'||NEW.PODE_FRACIONAR;
    END

    IF ( OLD.DESCRICAO_ALT <> NEW.DESCRICAO_ALT) THEN
    BEGIN
        HISTORICO = HISTORICO||', Desc.Alternativa:'|| OLD.DESCRICAO_ALT||'->'||NEW.DESCRICAO_ALT;
    END
    
    
    IF ( OLD.STATUSEXCLUSAO <> NEW.STATUSEXCLUSAO and new.STATUSEXCLUSAO = 0) THEN
    BEGIN
        HISTORICO = 'Registro Excluido';
    END
    
    IF ( OLD.STATUSEXCLUSAO <> NEW.STATUSEXCLUSAO and new.STATUSEXCLUSAO = 1) THEN
    BEGIN
        HISTORICO = 'Exclusão desfeita';
    END
    
    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBUNIDADEMEDIDA_TEMP',NEW.id, HISTORICO);
    END
end
^


/* Trigger: TTBUNIDADE_TEMP_B03I */
CREATE OR ALTER TRIGGER TTBUNIDADE_TEMP_B03I FOR TBUNIDADEMEDIDA_TEMP
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable CODIGO VARCHAR(10);
begin
    IF(NEW.SIGLA IS NOT NULL) THEN
    BEGIN
        CODIGO = COALESCE((SELECT FIRST 1 A.SIGLA FROM TBUNIDADEMEDIDA_TEMP A WHERE A.SIGLA = NEW.SIGLA),'');
    END
    
    IF(CODIGO <> '') THEN
    BEGIN
       EXCEPTION "..." 'SIGLA: '||CODIGO||' P/ UNIDADE DE MEDIDA JA CADASTRADA!';
    END
      /* Trigger text */
end
^


/* Trigger: TTBUNIDADE_TEMP_B0D_01 */
CREATE OR ALTER TRIGGER TTBUNIDADE_TEMP_B0D_01 FOR TBUNIDADEMEDIDA_TEMP
ACTIVE BEFORE DELETE POSITION 0
AS
DECLARE VARIABLE p1 integer;
DECLARE VARIABLE p2 integer;
Begin

For Select
(Select First 1 A.Codigo From TbFamilia A Where A.UnidadeMedida_Sigla = OLD.SIGLA) ,
(Select First 1 A.Codigo From TbProduto A Where A.UnidadeMedida_Sigla = OLD.SIGLA)

FROM RDB$DATABASE
Into :p1 , :p2
Do
begin

  if (:P1 > 0) Then Exception "..." 'REGISTRO JÁ VINCULADO AO CADASTRO DE FAMÍLIAS. ID.'||:P1||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
  if (:P2 > 0) Then Exception "..." 'REGISTRO JÁ VINCULADO AO CADASTRO DE PRODUTOS. ID.'||:P2||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';

end

End
^


/* Trigger: TTBUNIDADE_TEMP_B0I */
CREATE OR ALTER TRIGGER TTBUNIDADE_TEMP_B0I FOR TBUNIDADEMEDIDA_TEMP
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.Id is null) then
      new.Id = gen_id(gTBUNIDADEMEDIDA_TEMP,1);

  new.Importado = '0';
end
^


/* Trigger: TTBUNIDADE_TEMP_B0U */
CREATE OR ALTER TRIGGER TTBUNIDADE_TEMP_B0U FOR TBUNIDADEMEDIDA_TEMP
ACTIVE BEFORE UPDATE POSITION 0
as
begin
  if (new.Importado = '1') then
      new.Descricao = Old.Descricao;

  new.Importado = '0';
end
^

SET TERM ; ^



/******************************************************************************/
/****                         Fields descriptions                          ****/
/******************************************************************************/

COMMENT ON COLUMN TBUNIDADEMEDIDA_TEMP.DESCRICAO_ALT IS 
'Descição Alternativa para Uso na Unidade de Medida Alternativa';

/******************************************************************************/
/******************************************************************************/
/******************************************************************************/

INSERT INTO TBUNIDADEMEDIDA_TEMP (SIGLA, DESCRICAO, STATUS, STATUSEXCLUSAO, USUARIO_CODIGO, DATA, ID, PODE_FRACIONAR, IMPORTADO, DESCRICAO_ALT)
    SELECT 
        SIGLA,
        DESCRICAO,
        STATUS,
        STATUSEXCLUSAO,
        USUARIO_CODIGO,
        DATA,
        ID,
        PODE_FRACIONAR,
        IMPORTADO,
        DESCRICAO_ALT
    FROM TBUNIDADEMEDIDA;

/******************************************************************************/
/******************************************************************************/
/******************************************************************************/

SET TERM ^ ;

CREATE OR ALTER procedure SPC_FORTES_NFE (
    ESTABELECIMENTO integer,
    DATA_INICIAL date,
    DATA_FINAL date)
returns (
    CONTEUDO varchar(1000))
as
declare variable CONT1 varchar(1000);
declare variable CONT2 varchar(1000);
declare variable CONTADOR integer;
declare variable NFE_ID integer;
begin

  CONTADOR = 1;
  Conteudo = 'CAB'||
             '|'||'71'|| /* VERSAO */
             '|GCWeb'||
             '|'||EXTRACT(YEAR FROM CURRENT_DATE)||LPAD(EXTRACT(MONTH FROM CURRENT_DATE),2,'0')||LPAD(EXTRACT(DAY FROM CURRENT_DATE),2,'0')||
             '|'||COALESCE((SELECT VALOR_EXT FROM TBCONTROLE_N WHERE ID = 133),'')||  /* GRUPO EMPRESARIAL */
             '|'||EXTRACT(YEAR FROM DATA_INICIAL)||LPAD(EXTRACT(MONTH FROM DATA_INICIAL),2,'0')||LPAD(EXTRACT(DAY FROM DATA_INICIAL),2,'0')||
             '|'||EXTRACT(YEAR FROM DATA_FINAL)||LPAD(EXTRACT(MONTH FROM DATA_FINAL),2,'0')||LPAD(EXTRACT(DAY FROM DATA_FINAL),2,'0')||
             '|ENTRADAS COM PRODUTOS'||
             '|N';
  SUSPEND;

/*
        SELECT
        'PAR'||
        '|'||Empresa_Codigo||
        '|'||RazaoSocial||
        '|'||UF||
        '|'||Cnpj||
        '|'||IE||
        '|'||coalesce(Im,'')||
        '|N||||N||N|N|' ||
        '|'||Endereco||
        '|'||Numero||
        '|'||coalesce(Complemento,'')||
        '|01|'||Bairro||
        '|'||Cep||
        '|'||FN_LPAD(Codigo_Ibge,5,'0')||
        '|||||||'||
        IIF(UF<>'EX','1058',FN_LPAD(Codigo_Pais,4,'0'))
        FROM (
                SELECT 
                DISTINCT 
                IIF((A.CNPJ = '00000000000000' or A.CNPJ = '') and (A.UF <> 'EX'), B.EMPRESA_CNPJ, B.EMPRESA_CODIGO) as EMPRESA_CODIGO,
                B.EMPRESA_CNPJ AS CNPJ, 
                A.IE, 
                B.SUFRAMA,
                A.COMPLEMENTO, 
                A.IM,
                (SELECT First 1 E.PAIS_CODIGO FROM TBCIDADE E WHERE MAX(B.EMPRESA_CIDADE) = E.DESCRICAO AND MAX(B.EMPRESA_UF) = E.UF) Codigo_Pais,
                (SELECT First 1 E.CODIGOIBGE  FROM TBCIDADE E WHERE MAX(B.EMPRESA_CIDADE) = E.DESCRICAO AND MAX(B.EMPRESA_UF) = E.UF) Codigo_Ibge,
                MAX(B.EMPRESA_UF) AS UF,
                MAX(B.EMPRESA_RAZAOSOCIAL) AS RAZAOSOCIAL,
                MAX(B.EMPRESA_BAIRRO) AS BAIRRO,
                MAX(B.EMPRESA_ENDERECO) AS ENDERECO,
                MAX(B.EMPRESA_NUMERO) AS NUMERO,
                MAX(B.EMPRESA_CEP) AS CEP
                
                FROM TbNfs B, TBEMPRESA A
                
                WHERE  B.EMPRESA_CODIGO = A.CODIGO
                  AND B.sped = '1'
                  AND B.NATUREZA = 1
                  AND B.situacao = 2
                  AND B.estabelecimento_codigo = :ESTABELECIMENTO
                  and(Extract(Year  from B.Data_Emissao) = :ANO)
                  and(Extract(Month from B.Data_Emissao) = :MES)
                
                Group By
                A.CNPJ,A.UF,B.EMPRESA_CNPJ,B.EMPRESA_CODIGO,
                B.EMPRESA_CNPJ,A.IE,B.SUFRAMA,A.COMPLEMENTO,A.IM
                
                Order By 1
             )

        SELECT
        'PRO'||
        '|'||FN_LPAD(CODIGO,8,'0')||
        '|'||FN_RPAD(DESCRICAO,60,' ')||
        '|'||FN_LPAD(CODIGO,8,'0')||
        '|'||NCM2||
        '|'||UNIDADEMEDIDA_SIGLA||
        '|'||IIF( UNID = '1' , 'LT'  ,
             IIF( UNID = '2' , 'MT'  ,
             IIF( UNID = '3' , 'M3'  ,
             IIF( UNID = '4' , 'M2'  ,
             IIF( UNID = '5' , 'PR'  ,
             IIF( UNID = '6' , 'KG'  ,
             IIF( UNID = '7' , 'KW'  ,
             IIF( UNID = '8' , 'UN'  , '')))))))) ||
        '|||001|00||' AS PRO,
        
        'OUM'||
        '|'||FN_LPAD(CODIGO,8,'0')||
        '|'||UNIDADEMEDIDA_SIGLA||
        '|1.000' AS OUM
        FROM (
                SELECT DISTINCT
                       C.CODIGO,
                       C.DESCRICAO,
                       C.UNIDADEMEDIDA_SIGLA,
                       C.NCM_CODIGO NCM2,
                      (SELECT FIRST 1 E.UNID_DIEF FROM TBFAMILIA_FICHA E
                        WHERE C.FAMILIA_CODIGO = E.FAMILIA_CODIGO
                          AND E.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_CODIGO) UNID
                FROM TBNFS_ITEM A, TBNFS B, TBPRODUTO C
                WHERE A.NFS_CONTROLE = B.CONTROLE
                  AND C.CODIGO = A.PRODUTO_CODIGO
                  AND B.SPED = '1'
                
                  AND ((B.NATUREZA = 1 AND B.SITUACAO = 2) OR
                       (B.NATUREZA = 2 AND B.SITUACAO = 1 AND B.EMPRESA_UF <> 'EX'))
                
                  AND B.ESPECIE IN('01','1B','04','55')
                  AND B.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO
                  AND   (EXTRACT(YEAR  FROM B.DATA_EMISSAO) = :ANO)
                  AND   (EXTRACT(MONTH FROM B.DATA_EMISSAO) = :MES)
        
                ORDER BY 1
             )
   */

     /* EMPRESAS */
        FOR
        SELECT
        'PAR'||
        '|'||EMPRESA_CODIGO||
        '|'||RAZAOSOCIAL||
        '|'||UF||
        '|'||CNPJ||
        '|'||IE||
        '|'||COALESCE(IM,'')||
        '|N'||
        '|N'||
        '|N'||
        '|N'||
        '|N'||
        '|N'||
        '|N'||
        '|N'||
        '|'|| -- tipo logradouro
        '|'||ENDERECO||
        '|'||NUMERO||
        '|'||COALESCE(COMPLEMENTO,'')||
        '|01'|| -- tipo de bairro
        '|'||BAIRRO||
        '|'||CEP||
        '|'||FN_LPAD(CODIGO_IBGE,5,'0')||
        '|'||  -- ddd
        '|'||  -- telefone
        '|N'|| -- suframa
        '|'||  -- subst. icms
        '|'||  -- conta remetente
        '|'||  -- conta prestador
        '|'||IIF(UF<>'EX','1058',FN_LPAD(CODIGO_PAIS,4,'0'))||
        '|'||IIF(UF<>'EX','N','S')||
        '|N'||
        '|'||EMAIL

        FROM (
                SELECT DISTINCT
                CAST(B.EMPRESA_CODIGO AS VARCHAR(14)) AS EMPRESA_CODIGO, 
                A.UF, A.CNPJ, A.IE, A.RAZAOSOCIAL, 
                A.COMPLEMENTO, A.BAIRRO, A.ENDERECO, A.NUMERO, A.CEP, A.IM,
                (SELECT E.PAIS_CODIGO FROM TBCIDADE E WHERE 
                  A.CIDADE = E.DESCRICAO AND A.UF = E.UF) CODIGO_PAIS,
                (SELECT E.CODIGOIBGE  FROM TBCIDADE E WHERE 
                  A.CIDADE = E.DESCRICAO AND A.UF = E.UF) CODIGO_IBGE,
                  A.EMAIL
                FROM TBNFE B, TBEMPRESA A
                WHERE B.EMPRESA_CODIGO = A.CODIGO
                  AND B.SPED = '1'
                  AND ((B.NATUREZA = 1 AND B.SITUACAO = 2) OR
                       (B.NATUREZA = 2 AND B.SITUACAO = 1))
                  AND B.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO
                  AND B.DATA_FISCAL BETWEEN :DATA_INICIAL AND :DATA_FINAL
                ORDER BY 1
        
             )
        INTO :CONT1
        DO BEGIN
           CONTADOR = CONTADOR + 1;
           CONTEUDO = CONT1;
           SUSPEND;
           END

     /* GRUPOS / FAMILIAS */
          FOR
            SELECT
            'GRP'||
            '|'||FN_LPAD(CODIGO,8,'0')||
            '|'||DESCRICAO||
            '|'||IIF( SIT_SPED = '00' , '1'  ,
                 IIF( SIT_SPED = '01' , '2'  ,
                 IIF( SIT_SPED = '02' , '5'  ,
                 IIF( SIT_SPED = '03' , '3'  ,
                 IIF( SIT_SPED = '04' , '4'  ,
                 IIF( SIT_SPED = '05' , '7'  ,
                 IIF( SIT_SPED = '06' , '7'  ,
                 IIF( SIT_SPED = '07' , '7'  ,
                 IIF( SIT_SPED = '08' , '7'  ,
                 IIF( SIT_SPED = '09' , '7'  ,
                 IIF( SIT_SPED = '10' , '7'  ,
                 IIF( SIT_SPED = '99' , '7'  , '')))))))))))) ||
            '|'||SIT_SPED||
            '|'
            FROM (
                    SELECT DISTINCT
                           F.CODIGO,
                           F.DESCRICAO,
                           COALESCE((SELECT FIRST 1 E.NG_SITUACAO FROM TBFAMILIA_FICHA E
                            WHERE C.FAMILIA_CODIGO = E.FAMILIA_CODIGO
                              AND E.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_CODIGO),'99') SIT_SPED
                    FROM TBNFE_ITEM A, TBNFE B, TBPRODUTO C, TBFAMILIA F
                    WHERE A.NFE_CONTROLE = B.CONTROLE
                      AND C.CODIGO = A.PRODUTO_CODIGO
                      AND B.SPED = '1'
                      AND ((B.NATUREZA = 1 AND B.SITUACAO = 2) OR
                           (B.NATUREZA = 2 AND B.SITUACAO = 1 AND B.EMPRESA_UF <> 'EX'))
                      AND B.ESPECIE IN('01','1B','04','55')
                      AND C.FAMILIA_INVENTARIO = F.CODIGO
                      AND B.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO
                      AND B.DATA_FISCAL BETWEEN :DATA_INICIAL AND :DATA_FINAL
                 )
        INTO :CONT1 
        DO BEGIN
           CONTADOR = CONTADOR + 1;
           CONTEUDO = CONT1;
           SUSPEND;
           END


     /* UNIDADES DE MEDIDA */
          FOR
            SELECT
            'UND'||
            '|'||UM||
            '|'||FN_RPAD(DESCRICAO,60,' ')
            FROM (
                    SELECT DISTINCT
                           C.UNIDADEMEDIDA_SIGLA AS UM,
                           U.DESCRICAO
                    FROM TBNFE_ITEM A, TBNFE B, TBPRODUTO C, TBUNIDADEMEDIDA_TEMP U
                    WHERE A.NFE_CONTROLE = B.CONTROLE
                      AND C.CODIGO = A.PRODUTO_CODIGO
                      AND C.UNIDADEMEDIDA_SIGLA = U.SIGLA
                      AND B.SPED = '1'
                      AND ((B.NATUREZA = 1 AND B.SITUACAO = 2) OR
                           (B.NATUREZA = 2 AND B.SITUACAO = 1 AND B.EMPRESA_UF <> 'EX'))
                      AND B.ESPECIE IN('01','1B','04','55')
                      AND B.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO
                      AND B.DATA_FISCAL BETWEEN :DATA_INICIAL AND :DATA_FINAL
                 )
        INTO :CONT1
        DO BEGIN
           CONTADOR = CONTADOR + 1;
           CONTEUDO = CONT1;
           SUSPEND;
           END




     /* PRODUTO */
          FOR
            SELECT
            'PRO'||
            '|'||FN_LPAD(CODIGO,8,'0')||
            '|'||DESCRICAO||
            '|'||FN_LPAD(CODIGO,8,'0')||
            '|'||NCM||
            '|'||UM||
            '|'||UNID_DIEF||
            '|'||
            '|'||
            '|'||FN_LPAD(FAMILIA,8,'0')||
            '|'||
            '|'||
            '|'||
            '|'||
            '|'||CST_ORIGEM_PADRAO||CST_ICMS_PADRAO||
            '|'||'49'||
            '|'||CST_PISCOFINS_PADRAO||
            '|'||CST_PISCOFINS_PADRAO||
            '|'||
            '|'||
            '|'||
            '|'||
            '|'||
            '|'||'N'||
            '|'  AS PRO,

            'OUM'||
            '|'||FN_LPAD(CODIGO,8,'0')||
            '|'||UM||
            '|'||'1.000'||
            '|' -- COD BARRAS
                   AS OUM

            FROM (
                    SELECT DISTINCT
                           C.CODIGO,
                           C.DESCRICAO,
                           C.UNIDADEMEDIDA_SIGLA AS UM,
                           C.NCM_CODIGO AS NCM,
                           C.FAMILIA_INVENTARIO AS FAMILIA,

                          COALESCE((SELECT FIRST 1 E.UNID_DIEF FROM TBFAMILIA_FICHA E
                            WHERE C.FAMILIA_CODIGO = E.FAMILIA_CODIGO
                              AND E.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_CODIGO),'8') UNID_DIEF,
                          COALESCE((SELECT FIRST 1 E.CST_ORIGEM FROM TBFAMILIA_FICHA E
                            WHERE C.FAMILIA_CODIGO = E.FAMILIA_CODIGO
                              AND E.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_CODIGO),'0') CST_ORIGEM_PADRAO,
                          COALESCE((SELECT FIRST 1 E.CST FROM TBFAMILIA_FICHA E
                            WHERE C.FAMILIA_CODIGO = E.FAMILIA_CODIGO
                              AND E.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_CODIGO),'90') CST_ICMS_PADRAO,
                          COALESCE((SELECT FIRST 1 E.CST_PISCOF FROM TBFAMILIA_FICHA E
                            WHERE C.FAMILIA_CODIGO = E.FAMILIA_CODIGO
                              AND E.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_CODIGO),'98') CST_PISCOFINS_PADRAO

                    FROM TBNFE_ITEM A, TBNFE B, TBPRODUTO C
                    WHERE A.NFE_CONTROLE = B.CONTROLE
                      AND C.CODIGO = A.PRODUTO_CODIGO
                      AND B.SPED = '1'
                      AND ((B.NATUREZA = 1 AND B.SITUACAO = 2) OR
                           (B.NATUREZA = 2 AND B.SITUACAO = 1 AND B.EMPRESA_UF <> 'EX'))
                      AND B.ESPECIE IN('01','1B','04','55')
                      AND B.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO
                      AND B.DATA_FISCAL BETWEEN :DATA_INICIAL AND :DATA_FINAL
                    ORDER BY 1
                 )
        INTO :CONT1, :CONT2
        DO BEGIN
           CONTADOR = CONTADOR + 1;
           CONTEUDO = CONT1;
           SUSPEND;

           CONTADOR = CONTADOR + 1;
           CONTEUDO = CONT2;
           SUSPEND;
           END


        /* NOTAS DE ENTRADA */
            FOR
                SELECT
                'NFM'||
                '|'||LPAD(ESTABELECIMENTO_ID,4,'0')||
                '|'||'E'||
                '|'||DESCRICAO_ESPECIE||
                '|'||IIF(NATUREZA=1,'S','N')||
                '|'|| --AIDF
                '|'||SERIE||
                '|'||
                '|'||LPAD(NUMERO_NOTAFISCAL,9,'0')||
                '|'||
                '|'||
                '|'||EXTRACT(YEAR FROM DATA_EMISSAO)||LPAD(EXTRACT(MONTH FROM DATA_EMISSAO),2,'0')||LPAD(EXTRACT(DAY FROM DATA_EMISSAO),2,'0')||
                '|'||-- situação do documento, informado só pra saída   IIF(SITUACAO=3,'1','0')||
                '|'||EXTRACT(YEAR FROM DATA_FISCAL)||LPAD(EXTRACT(MONTH FROM DATA_FISCAL),2,'0')||LPAD(EXTRACT(DAY FROM DATA_FISCAL),2,'0')||
                '|'||EMPRESA_ID||
                '|'||'N'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||

                '|'||CAST(VALOR_PRODUTOS AS NUMERIC(15,2))||
                '|'||CAST(VALOR_FRETE AS NUMERIC(15,2))||
                '|'||CAST(VALOR_SEGURO AS NUMERIC(15,2))||
                '|'||CAST(VALOR_OUTROSCUSTOS AS NUMERIC(15,2))||
                '|'||0.00|| /* icms importação */
                '|'||0.00|| /* icms diferido */
                '|'||CAST(VALOR_IPI AS NUMERIC(15,2))||
                '|'||0.00||/* icms subst retido */
                '|'||CAST(VALOR_ISSQN AS NUMERIC(15,2))||
                '|'||CAST(VALOR_DESCONTO AS NUMERIC(15,2))||
                '|'||CAST(VALOR_TOTAL_NF AS NUMERIC(15,2))||
                '|'||LPAD(ITENS,10,'0')||
                '|'||'N'||
                '|'||'N'||
                '|'||'N'||
                '|'||
                '|'||
                '|'||
                '|'||'N'||
                '|'||
                '|'||
                '|'||

                '|'||'N'||--FRETE||
                '|'||'N'||--PAGAMENTO||
                '|'||
                '|'||

                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||CAST(RETENCAO_VALOR_COFINS AS NUMERIC(15,2))||
                '|'||CAST(RETENCAO_VALOR_PIS AS NUMERIC(15,2))||
                '|'||CAST(RETENCAO_VALOR_CSLL AS NUMERIC(15,2))||
                '|'||
                '|'||'N'||
                '|'||
                '|'||
                '|'||CHAVE_ACESSO||
                '|'||
                '|'||

                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'

                ,NFE_ID
                
                FROM (
                        SELECT B.CONTROLE NFE_ID,
                               B.ESTABELECIMENTO_CODIGO AS ESTABELECIMENTO_ID,
                               B.EMPRESA_CODIGO AS EMPRESA_ID,
                               B.ESPECIE,
                               B.MODELO,
                               B.SERIE,
                               B.NUMERO_NOTAFISCAL,
                               B.CHAVE_ACESSO,
                               B.DATA_EMISSAO,
                               B.DATA_FISCAL,
                               B.NATUREZA,
                               B.SITUACAO,
                               MAX((SELECT MAX(E.XML) FROM TBNF_LOTE E WHERE B.CONTROLE = E.NFE_CONTROLE AND E.NFS_CONTROLE = 0 AND B.ESTABELECIMENTO_CODIGO = E.ESTABELECIMENTO_CODIGO)) XML,
                              (SELECT FIRST 1 D.FRETE FROM TBNFE_TRANSPORTADORA D WHERE  D.NFE_CONTROLE = B.CONTROLE) AS FRETE,
                              (SELECT FIRST 1 G.DESCRICAO_RESUMIDA FROM TBFISCAL_ESPECIE G WHERE B.MODELO = G.CODIGO_DIEF AND B.ESPECIE = G.CODIGO_SPED) DESCRICAO_ESPECIE,
                               COALESCE(IIF((SELECT CAST(COUNT(P.PARCELA) AS INTEGER) FROM TBNFE_PARCELAMENTO P WHERE B.CONTROLE = P.NFE_CONTROLE) > 0, '1' /*PRAZO*/, '2'/*OUTROS*/),'2') AS PAGAMENTO,
                        
                               COUNT(A.CONTROLE) AS ITENS,
                               SUM(A.VALOR_DESCONTO) AS VALOR_DESCONTO,
                               SUM(A.VALOR_PEDAGIO) AS VALOR_PEDAGIO,
                               SUM(A.VALOR_FRETE) AS VALOR_FRETE,
                               SUM(A.VALOR_SEGURO) AS VALOR_SEGURO,
                               SUM(A.FISCAL_BASECALCULO_ICMS_ST) basecalculo_icms_subst,
                               SUM(A.FISCAL_VALOR_ICMS_ST) valor_icms_subst,
                               SUM(A.VALOR_TOTAL) VALOR_PRODUTOS,
                               SUM(A.VALOR_CONTABIL) VALOR_CONTABIL,
                               SUM(A.VALOR_BASECALCULO_ICMS) BASECALCULO_ICMS,
                               SUM(A.FISCAL_VALOR_ICMS) VALOR_ICMS,
                               SUM(A.FISCAL_VALOR_IPI) VALOR_IPI,
                               SUM(A.FISCAL_VALOR_PIS) VALOR_PIS,
                               SUM(A.FISCAL_VALOR_COFINS) VALOR_COFINS,
                               SUM(A.FISCAL_BASECALCULO_IPI) AS BASECALCULO_IPI,
                               SUM(A.VALOR_ACRESCIMO) AS VALOR_ACRESCIMO,
                        
                               C.VALOR_OUTROSCUSTOS,
                               C.VALOR_TOTAL_NF,
                               C.VALOR_ISSQN,
                               C.RETENCAO_VALOR_ISSQN,
                               C.RETENCAO_VALOR_COFINS,
                               C.RETENCAO_VALOR_PIS,
                               C.RETENCAO_VALOR_CSLL,
                               C.RETENCAO_VALOR_IRRF,
                               C.RETENCAO_VALOR_INSS
                        
                        FROM TBNFE_ITEM A, TBNFE B, TBNFE_TOTAIS C
                        WHERE  A.NFE_CONTROLE = B.CONTROLE
                          AND  C.NFE_CONTROLE = B.CONTROLE
                          AND  B.SPED = '1'
                          AND ((B.NATUREZA = 1 AND B.SITUACAO > 1) OR (B.NATUREZA = 2 AND B.SITUACAO = 1))
                          AND  B.ESPECIE IN('01','1B','55')
                          AND  B.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO
                          AND  B.DATA_FISCAL BETWEEN :DATA_INICIAL AND :DATA_FINAL

                        GROUP BY
                        B.CONTROLE, B.ESTABELECIMENTO_CODIGO, B.EMPRESA_CODIGO, B.ESPECIE,
                        B.SERIE, B.NUMERO_NOTAFISCAL, B.CHAVE_ACESSO, B.DATA_EMISSAO,
                        B.DATA_FISCAL, B.NATUREZA, B.SITUACAO, C.VALOR_OUTROSCUSTOS,
                        C.VALOR_TOTAL_NF, C.VALOR_ISSQN, B.MODELO, C.RETENCAO_VALOR_ISSQN,
                        C.RETENCAO_VALOR_COFINS, C.RETENCAO_VALOR_PIS, C.RETENCAO_VALOR_CSLL,
                        C.RETENCAO_VALOR_IRRF, C.RETENCAO_VALOR_INSS
                )
        INTO :CONT1, :NFE_ID
        DO BEGIN
           CONTADOR = CONTADOR + 1;
           CONTEUDO = CONT1;
           SUSPEND;







       /* ITENS DAS NOTAS FISCAIS DE ENTRADA */
             FOR
                SELECT
                'PNM'||
                '|'||LPAD(PRODUTO_CODIGO,8,'0')||
                '|'||REPLACE(FISCAL_CFOP_CODIGO,'.','')||
                '|'||
                '|'||FISCAL_TRIBUTACAO_ORIGEM||
                '|'||LPAD(FISCAL_TRIBUTACAO_ICMS,2,'0')||
                '|'||PRODUTO_UNIDADEMEDIDA||
                '|'||CAST(QUANTIDADE AS NUMERIC(15,2))||
                '|'||CAST(VALOR_TOTAL AS NUMERIC(15,2))||
                '|'||CAST(FISCAL_VALOR_IPI AS NUMERIC(15,2))||
                '|'||IIF(FISCAL_TRIBUTACAO_ICMS =  0, '1',
                     IIF(FISCAL_TRIBUTACAO_ICMS = 20, '1',
                     IIF(FISCAL_TRIBUTACAO_ICMS = 30, '2',
                     IIF(FISCAL_TRIBUTACAO_ICMS = 40, '2',
                     IIF(FISCAL_TRIBUTACAO_ICMS = 41, '2','3')))))||
                '|'||CAST(BASECALCULO_ICMS_R AS NUMERIC(15,2))||
                '|'||CAST(FISCAL_PERCENTUAL_ICMS AS NUMERIC(15,2))||
                '|'||
                '|'||
                '|'||'0'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||

                '|'||IIF(FISCAL_TRIBUTACAO_IPI ='00','1',
                     IIF(FISCAL_TRIBUTACAO_IPI ='01','1',
                     IIF(FISCAL_TRIBUTACAO_IPI ='02','2',
                     IIF(FISCAL_TRIBUTACAO_IPI ='03','2',
                     IIF(FISCAL_TRIBUTACAO_IPI ='04','3',
                     IIF(FISCAL_TRIBUTACAO_IPI ='05','3',
                     IIF(FISCAL_TRIBUTACAO_IPI ='49','3','3')))))))||
                '|'||CAST(FISCAL_BASECALCULO_IPI AS NUMERIC(15,2))||
                '|'||CAST(FISCAL_PERCENTUAL_IPI AS NUMERIC(15,2))||
                '|'||CAST(FISCAL_VALOR_IPI AS NUMERIC(15,2))||
                '|'||FISCAL_TRIBUTACAO_IPI||

                '|'|| -- FISCAL_TRIBUTACAO_COFINS||
                '|'|| -- FISCAL_TRIBUTACAO_PIS||

                '|'||CAST(FISCAL_BASECALCULO_COFINS AS NUMERIC(15,2))||
                '|'||CAST(FISCAL_BASECALCULO_PIS AS NUMERIC(15,2))||

                '|'||CAST(VALOR_FRETE AS NUMERIC(15,2))||
                '|'||CAST(VALOR_SEGURO AS NUMERIC(15,2))||
                '|'||CAST(VALOR_DESCONTO AS NUMERIC(15,2))||
                '|'||CAST(VALOR_TOTAL+VALOR_FRETE+VALOR_SEGURO-VALOR_DESCONTO AS NUMERIC(15,2))||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||'1'||
                '|'||
                '|'||
                '|'||
                '|'||'1'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||'0'
                FROM (
                        SELECT B.SEQUENCIA,
                               B.PRODUTO_CODIGO,
                               B.FISCAL_CFOP_CODIGO,
                               B.FISCAL_TRIBUTACAO_ORIGEM, 
                               B.PRODUTO_UNIDADEMEDIDA,
                               B.QUANTIDADE,
                               B.VALOR_TOTAL, 
                               B.FISCAL_TRIBUTACAO_ICMS,
                               B.VALOR_BASECALCULO_ICMS AS BASECALCULO_ICMS_R,
                               B.FISCAL_PERCENTUAL_ICMS,
                               B.FISCAL_TRIBUTACAO_IPI,
                               B.FISCAL_BASECALCULO_IPI,
                               B.FISCAL_PERCENTUAL_IPI,
                               B.FISCAL_VALOR_IPI, 
                               B.FISCAL_TRIBUTACAO_COFINS,
                               B.FISCAL_BASECALCULO_COFINS,
                               B.FISCAL_TRIBUTACAO_PIS,
                               B.FISCAL_BASECALCULO_PIS,
                               B.VALOR_FRETE,
                               B.VALOR_SEGURO,
                               B.VALOR_DESCONTO,
                               B.VALOR_CONTABIL 
                        
                        FROM TBNFE_ITEM B
                        WHERE B.NFE_CONTROLE = :NFE_ID
                        ORDER BY 1
                 )
                INTO :CONT1
                DO BEGIN
                   CONTADOR = CONTADOR + 1;
                   CONTEUDO = CONT1;
                   SUSPEND;
                   END


                 /* TOTALIZADORES DA NF POR CFOP */
                  FOR
                    SELECT
                    'INM'||
                    '|'||CAST(VALOR AS NUMERIC(15,2))||
                    '|'||EMPRESA_UF||
                    '|'||REPLACE(FISCAL_CFOP_CODIGO,'.','')||
                    '|'||
                    '|'||CAST(BASECALCULO_ICMS_R AS NUMERIC(15,2))||
                    '|'||CAST(FISCAL_PERCENTUAL_ICMS AS NUMERIC(15,2))||
                    '|'||CAST(VALOR_ICMS AS NUMERIC(15,2))||
                    '|'||CAST(iICMS AS NUMERIC(15,2))||
                    '|'||CAST(oICMS AS NUMERIC(15,2))||
                    
                    '|'||CAST(BcIPI AS NUMERIC(15,2))||
                    '|'||CAST(VALOR_IPI AS NUMERIC(15,2))||
                    '|'||CAST(IIPI AS NUMERIC(15,2))||
                    '|'||CAST(oIPI AS NUMERIC(15,2))||
                    '|'||
                    '|'||
                    '|'||
                    '|'
                    
                    FROM (
                            SELECT 
                            A.FISCAL_CFOP_CODIGO,
                            E.EMPRESA_UF,
                            A.FISCAL_Percentual_Icms,
                            A.FISCAL_Percentual_Ipi,
                            A.FISCAL_Tributacao_Icms,
                            A.FISCAL_Tributacao_Ipi,
                            SUM(A.VALOR_TOTAL) VALOR,
                            SUM(A.FISCAL_VALOR_IPI) VALOR_IPI,
                            SUM(A.FISCAL_VALOR_ICMS) VALOR_ICMS,
                            SUM(A.FISCAL_BASECALCULO_ICMS) BCICMS,
                            SUM(A.FISCAL_BASECALCULO_IPI) BcIPI, 
                            SUM(A.FISCAL_ISENTAS_ICMS) IICMS,
                            SUM(A.FISCAL_ISENTAS_IPI) IIPI, 
                            SUM(A.FISCAL_OUTRAS_ICMS) OICMS,
                            SUM(A.FISCAL_OUTRAS_IPI) OIPI,
                            SUM(A.VALOR_BASECALCULO_ICMS) BASECALCULO_ICMS_R
                            
                            FROM TBNFE_ITEM A, TBNFE E
                            WHERE A.NFE_CONTROLE = E.CONTROLE
                              AND A.NFE_CONTROLE = :NFE_ID
                            
                            Group By 
                            A.FISCAL_CFOP_CODIGO,
                            E.EMPRESA_UF,
                            A.FISCAL_PERCENTUAL_ICMS,
                            A.FISCAL_PERCENTUAL_IPI, 
                            A.FISCAL_TRIBUTACAO_ICMS,
                            A.FISCAL_TRIBUTACAO_IPI
                    )
                INTO :CONT1
                DO BEGIN
                   CONTADOR = CONTADOR + 1;
                   CONTEUDO = CONT1;
                   SUSPEND;
                   END

       END


           /* FRETES */
             FOR
                SELECT
                'CTC'||
                '|'||LPAD(ESTABELECIMENTO_ID,4,'0')||
                '|'||'E'||
                '|'||DESCRICAO_ESPECIE||
                '|'||  
                '|'||SERIE||
                '|'||
                '|'||LPAD(NUMERO_NOTAFISCAL,9,'0')||
                '|'||
                '|'||EXTRACT(YEAR FROM DATA_EMISSAO)||LPAD(EXTRACT(MONTH FROM DATA_EMISSAO),2,'0')||LPAD(EXTRACT(DAY FROM DATA_EMISSAO),2,'0')||

                '|'||'0'|| -- Situação do Documento
                '|'||EXTRACT(YEAR FROM DATA_FISCAL)||LPAD(EXTRACT(MONTH FROM DATA_FISCAL),2,'0')||LPAD(EXTRACT(DAY FROM DATA_FISCAL),2,'0')||
                '|'||IIF(FRETE = 0, 'C',
                     IIF(FRETE = 1, 'F',
                     IIF(FRETE = 2, 'S',
                     IIF(FRETE = 3, 'S',
                     IIF(FRETE = 4, 'S',
                     IIF(FRETE = 9, 'S','S'))))))||
                '|'||EMPRESA_ID||
                '|'||
                '|'||REPLACE(FISCAL_CFOP_CODIGO,'.','')||
                '|'||CAST(VALOR_TOTAL_NF AS NUMERIC(15,2))||
                '|'||CAST(VALOR_BASECALCULO_ICMS AS NUMERIC(15,2))||
                '|'||CAST(FISCAL_PERCENTUAL_ICMS AS NUMERIC(15,2))||
                '|'||CAST(VALOR_ICMS AS NUMERIC(15,2))||

                '|'||CAST(VALOR_ISENTAS_ICMS AS NUMERIC(15,2))||
                '|'||CAST(VALOR_OUTRAS_ICMS  AS NUMERIC(15,2))||
                '|'||(SELECT UF FROM TBUF WHERE CODIGO_IBGE = SUBSTRING(CMUNINI FROM 1 FOR 2))||
                '|'||SUBSTRING(CMUNINI FROM 3 FOR 5)||
                '|'||(SELECT UF FROM TBUF WHERE CODIGO_IBGE = SUBSTRING(CMUNFIM FROM 1 FOR 2))||
                '|'||SUBSTRING(CMUNFIM FROM 3 FOR 5)||
                '|'||   -- DISTANCIA
                '|'||   -- QUANT. MERCADORIAS
                '|'||   -- UNID MEDIDA
                '|'||   -- FRETE CALCULADO

                '|'||   -- PLACA DO VEICULO
                '|'||   -- UF VEICULO
                '|'||   -- AIDF DO RMD
                '|'||   -- SERIE DO RMD
                '|'||   -- SUBSERIE DO RMD
                '|'||   -- NUMERO DO RMD
                '|'||'N'|| -- DIF ALIQUOTA (S/N)
                '|'||   -- BS CALC DIF ALIQUOTA
                '|'||   -- ALIQ ORIGEM
                '|'||   -- ALIQ INTERNA

                '|'||   -- RECEITA TRIBUTAVEL COFINS
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||

                '|'||  -- CSL RETIDO NA FONTE
                '|'||
                '|'||
                '|'||'N'||
                '|'||FN_LPAD(FISCAL_TRIBUTACAO_ICMS,2,'0')|| -- CSTb ICMS
                '|'||IIF(DESCRICAO_ESPECIE='CTE',CHAVE_ACESSO,'')||
                '|'|| -- COD INF COMPLEMENTAR
                '|'||FISCAL_TRIBUTACAO_PIS||
                '|'||FISCAL_TRIBUTACAO_COFINS||
                '|'||

                '|'||IND_NAT_FRETE||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'

                FROM (
                        SELECT B.CONTROLE NFE_ID,
                               B.ESTABELECIMENTO_CODIGO AS ESTABELECIMENTO_ID,
                               B.EMPRESA_CODIGO AS EMPRESA_ID,
                               B.ESPECIE,
                               B.MODELO,
                               B.SERIE,
                               B.NUMERO_NOTAFISCAL,
                               B.CHAVE_ACESSO,
                               B.DATA_EMISSAO,
                               B.DATA_FISCAL,
                               B.NATUREZA,
                               B.SITUACAO,
                               D.FRETE,
                               D.CMUNINI,
                               D.CMUNFIM,
                               D.IND_NAT_FRETE,
                              (SELECT FIRST 1 G.DESCRICAO_RESUMIDA FROM TBFISCAL_ESPECIE G WHERE B.MODELO = G.CODIGO_DIEF AND B.ESPECIE = G.CODIGO_SPED) DESCRICAO_ESPECIE,
                
                               A.FISCAL_CFOP_CODIGO,
                               A.FISCAL_PERCENTUAL_ICMS,
                               SUM(A.VALOR_DESCONTO) AS VALOR_DESCONTO,
                               SUM(A.VALOR_PEDAGIO) AS VALOR_PEDAGIO,
                               SUM(A.VALOR_FRETE) AS VALOR_FRETE,
                               SUM(A.VALOR_SEGURO) AS VALOR_SEGURO,
                               SUM(A.VALOR_TOTAL) VALOR_PRODUTOS,
                               SUM(A.VALOR_CONTABIL) VALOR_CONTABIL,
                               SUM(A.VALOR_BASECALCULO_ICMS) VALOR_BASECALCULO_ICMS,
                               SUM(A.FISCAL_VALOR_ICMS) VALOR_ICMS,
                               SUM(A.FISCAL_ISENTAS_ICMS) VALOR_ISENTAS_ICMS,
                               SUM(A.FISCAL_OUTRAS_ICMS) VALOR_OUTRAS_ICMS,
                               SUM(A.FISCAL_VALOR_IPI) VALOR_IPI,
                               SUM(A.FISCAL_VALOR_PIS) VALOR_PIS,
                               SUM(A.FISCAL_VALOR_COFINS) VALOR_COFINS,
                               SUM(A.VALOR_ACRESCIMO) AS VALOR_ACRESCIMO,
                               C.VALOR_TOTAL_NF,
                               A.FISCAL_TRIBUTACAO_ICMS,
                               A.FISCAL_TRIBUTACAO_PIS,
                               A.FISCAL_TRIBUTACAO_COFINS
                
                        FROM TBNFE_ITEM A, TBNFE B, TBNFE_TOTAIS C, TBNFE_TRANSPORTADORA D 
                        WHERE  A.NFE_CONTROLE = B.CONTROLE
                          AND  C.NFE_CONTROLE = B.CONTROLE
                          AND  D.NFE_CONTROLE = B.CONTROLE
                          AND  B.SPED = '1'
                          AND  B.ESPECIE IN('07','08','8B','09','10','11','26','27','57')
                          AND  B.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO
                          AND B.DATA_FISCAL BETWEEN :DATA_INICIAL AND :DATA_FINAL

                        GROUP BY
                        B.CONTROLE, B.ESTABELECIMENTO_CODIGO, B.EMPRESA_CODIGO, B.ESPECIE,
                        B.SERIE, B.NUMERO_NOTAFISCAL, B.CHAVE_ACESSO, B.DATA_EMISSAO,
                        B.DATA_FISCAL, B.NATUREZA, B.SITUACAO, C.VALOR_OUTROSCUSTOS,
                        C.VALOR_TOTAL_NF, B.MODELO, A.FISCAL_CFOP_CODIGO, A.FISCAL_PERCENTUAL_ICMS,
                        D.FRETE, D.CMUNINI, D.CMUNFIM, D.IND_NAT_FRETE, A.FISCAL_TRIBUTACAO_PIS,
                        A.FISCAL_TRIBUTACAO_COFINS,A.FISCAL_TRIBUTACAO_ICMS
                )
                INTO :CONT1
                DO BEGIN
                   CONTADOR = CONTADOR + 1;
                   CONTEUDO = CONT1;
                   SUSPEND;
                   END

    CONTEUDO = 'TRA'||
               '|'||FN_LPAD(CONTADOR+1,10,'0');
    SUSPEND;

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_MODELOS_REMSSA (
    REMESSAS blob sub_type 1 segment size 80 = '',
    DATA1 date = null,
    DATA2 date = null,
    FAMILIAS blob sub_type 1 segment size 80 = '',
    STATUS_TALAO integer = 0,
    ESTABELECIMENTO integer = 0)
returns (
    MODELO_ID integer,
    MODELO_DESCRICAO varchar(200),
    COR_ID integer,
    COR_DESCRICAO varchar(80),
    TAM_DESCRICAO varchar(40),
    GRADE_CODIGO integer,
    TAMANHO integer,
    QUANTIDADE numeric(18,4),
    SALDO_FATURAR numeric(18,4),
    ALOC_EST numeric(18,4),
    ALOC_REM numeric(18,4),
    ALOC_AGR numeric(18,4),
    PEDIDO integer,
    CLIENTE_CODIGO integer,
    CLIENTE varchar(80),
    DATA date,
    PREV_FATURAMENTO date,
    DATA_CLIENTE date,
    PRODUTO_ID integer,
    FAMILIA_ID integer,
    UM varchar(12),
    FRACIONAR char(4),
    INFO blob sub_type 1 segment size 100)
as
declare variable OREMESSA integer;
declare variable TIPO_REMESSA integer;
begin

  for
    select
        osplit
    from split(:REMESSAS,',')
  into OREMESSA
  do begin

      TIPO_REMESSA = coalesce((select first 1 0 from tbremessa_acumulado a where a.remessa = :OREMESSA),1);

      if(TIPO_REMESSA = 1)then
      begin
        for
            SELECT
                A.MODELO_CODIGO MODELO_ID,
                M.DESCRICAO MODELO_DESCRICAO,
                A.COR_ID,
                (SELECT FIRST 1 C.DESCRICAO FROM TBCOR C WHERE C.CODIGO = A.COR_ID) COR_DESCRICAO,
                (SELECT TAM_DESCRICAO FROM SP_TAMANHO_GRADE (M.GRADE_CODIGO,A.TAMANHO)) TAM_DESCRICAO,
                M.GRADE_CODIGO,
                A.TAMANHO,
                CAST(A.QUANTIDADE_PEDIDO AS NUMERIC(15,4)) QUANTIDADE,
                CAST(0.0000 AS NUMERIC(15,4)) SALDO_FATURAR,
                CAST(0.0000 AS NUMERIC(15,4)) ALOC_EST,
                CAST(0.0000 AS NUMERIC(15,4)) ALOC_REM,
                CAST(0.0000 AS NUMERIC(15,4)) ALOC_AGR,
                0 PEDIDO, 0 CLIENTE_CODIGO,
                CAST('' AS VARCHAR(20)) CLIENTE,
                CAST(NULL AS DATE) DATA,
                CAST(NULL AS DATE) PREV_FATURAMENTO,
                CAST(NULL AS DATE) DATA_CLIENTE,
                P.CODIGO AS PRODUTO_ID,
                P.FAMILIA_CODIGO AS FAMILIA_ID,
                U.SIGLA AS UM,
                U.PODE_FRACIONAR AS FRACIONAR,
        
                FN_TO_JSON_V2(
                    FN_TO_PAR_JSON_V2('REMESSA', R.REMESSA),
                    FN_TO_PAR_JSON_V2('NUMERO', R.NUMERO),
                    FN_TO_PAR_JSON_V2('TALAO', fn_lpad(A.REMESSA_ACUMULADO_CONTROLE,4,'0')),
                    FN_TO_PAR_JSON_V2('CONTROLE', A.CONTROLE),
                    FN_TO_PAR_JSON_V2('QUANTIDADE', A.QUANTIDADE_PEDIDO),
                    FN_TO_PAR_JSON_V2('ORIGEM', coalesce(R.ORIGEM,'0'))
                ) AS INFO
        
            FROM TBPEDIDO_ITEM_PROCESSADO A, TBREMESSA R, TBMODELO M, TBPRODUTO P, TBUNIDADEMEDIDA_TEMP U
            WHERE A.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO
            AND A.MODELO_CODIGO = M.CODIGO
            AND A.ESTABELECIMENTO_CODIGO = R.ESTABELECIMENTO_CODIGO
            AND A.REMESSA = R.NUMERO
            
            AND P.MODELO_CODIGO = M.CODIGO
            AND P.COR_CODIGO    = A.COR_ID
            AND P.CODIGO        = A.PRODUTO_CODIGO
            AND U.SIGLA         = P.UNIDADEMEDIDA_SIGLA
            and R.NUMERO        = :OREMESSA

            and iif(:STATUS_TALAO > 0 , iif(:STATUS_TALAO = 2, A.SITUACAO < 3 and A.DATA_PRODUCAO is NULL, A.SITUACAO = 3 and A.DATA_PRODUCAO is NULL), true)
            and iif(:DATA1 is distinct from null and :DATA2 is distinct from null, R.DATA BETWEEN :DATA1 AND :DATA2, true)
            and iif(char_length(:FAMILIAS) > 1, M.FAMILIA_CODIGO in (select osplit from split(:FAMILIAS,',')),true)

         into
            MODELO_ID,
            MODELO_DESCRICAO,
            COR_ID,
            COR_DESCRICAO,
            TAM_DESCRICAO,
            GRADE_CODIGO,
            TAMANHO,
            QUANTIDADE,
            SALDO_FATURAR,
            ALOC_EST,
            ALOC_REM,
            ALOC_AGR,
            PEDIDO,
            CLIENTE_CODIGO,
            CLIENTE,
            DATA,
            PREV_FATURAMENTO,
            DATA_CLIENTE,
            PRODUTO_ID,
            FAMILIA_ID,
            UM,
            FRACIONAR,
            INFO
        do begin
            suspend;
        end
    
      end else
      begin
        for
            SELECT 
            
                A.MODELO_CODIGO MODELO_ID, M.DESCRICAO MODELO_DESCRICAO, A.cor_codigo as COR_ID,
                (SELECT FIRST 1 C.DESCRICAO FROM TBCOR C WHERE C.CODIGO = A.cor_codigo) COR_DESCRICAO,
                (SELECT TAM_DESCRICAO FROM SP_TAMANHO_GRADE (M.GRADE_CODIGO,A.TAMANHO)) TAM_DESCRICAO,
                M.GRADE_CODIGO, A.TAMANHO, CAST(A.quantidade AS NUMERIC(15,4)) QUANTIDADE,
                CAST(0.0000 AS NUMERIC(15,4)) SALDO_FATURAR,
                CAST(0.0000 AS NUMERIC(15,4)) ALOC_EST,
                CAST(0.0000 AS NUMERIC(15,4)) ALOC_REM,
                CAST(0.0000 AS NUMERIC(15,4)) ALOC_AGR,
                0 PEDIDO, 0 CLIENTE_CODIGO,
                CAST('' AS VARCHAR(20)) CLIENTE,
                CAST(NULL AS DATE) DATA,
                CAST(NULL AS DATE) PREV_FATURAMENTO,
                CAST(NULL AS DATE) DATA_CLIENTE,
                P.CODIGO AS PRODUTO_ID,
                P.FAMILIA_CODIGO AS FAMILIA_ID,
                U.SIGLA AS UM,
                U.PODE_FRACIONAR AS FRACIONAR,
            
                FN_TO_JSON_V2(
                    FN_TO_PAR_JSON_V2('REMESSA', R.REMESSA),
                    FN_TO_PAR_JSON_V2('NUMERO', R.NUMERO),
                    FN_TO_PAR_JSON_V2('TALAO', fn_lpad(0,4,'0')),
                    FN_TO_PAR_JSON_V2('CONTROLE', A.CONTROLE),
                    FN_TO_PAR_JSON_V2('QUANTIDADE', A.quantidade),
                    FN_TO_PAR_JSON_V2('ORIGEM', coalesce(R.ORIGEM,'0'))
                ) INFO

            FROM TBREMESSA_ACUMULADO A, TBREMESSA R, TBMODELO M, TBPRODUTO P, TBUNIDADEMEDIDA_TEMP U
            WHERE A.MODELO_CODIGO = M.CODIGO
            AND A.ESTABELECIMENTO_CODIGO = R.ESTABELECIMENTO_CODIGO
            AND A.REMESSA = R.NUMERO
            
            AND P.MODELO_CODIGO     = M.CODIGO
            AND P.COR_CODIGO        = A.cor_codigo
            AND P.CODIGO            = A.PRODUTO_CODIGO
            AND U.SIGLA             = P.UNIDADEMEDIDA_SIGLA
            AND R.NUMERO            = :OREMESSA

            and iif(:DATA1 is distinct from null and :DATA2 is distinct from null, R.DATA BETWEEN :DATA1 AND :DATA2, true)
            and iif(char_length(:FAMILIAS) > 1, M.FAMILIA_CODIGO in (select osplit from split(:FAMILIAS,',')),true)

         into
            MODELO_ID,
            MODELO_DESCRICAO,
            COR_ID,
            COR_DESCRICAO,
            TAM_DESCRICAO,
            GRADE_CODIGO,
            TAMANHO,
            QUANTIDADE,
            SALDO_FATURAR,
            ALOC_EST,
            ALOC_REM,
            ALOC_AGR,
            PEDIDO,
            CLIENTE_CODIGO,
            CLIENTE,
            DATA,
            PREV_FATURAMENTO,
            DATA_CLIENTE,
            PRODUTO_ID,
            FAMILIA_ID,
            UM,
            FRACIONAR,
            INFO
        do begin
            suspend;
        end
      end
  end

end
^

SET TERM ; ^

CREATE OR ALTER VIEW VWPDV_PRODUTOS(
    ESTABELECIMENTO_ID,
    LOCALIZACAO_ID,
    FAMILIA_ID,
    MODELO_ID,
    PRODUTO_ID,
    PRODUTO_DESCRICAO,
    COR_DESCRICAO,
    UM,
    NCM,
    EAN,
    TAMANHO,
    FRACIONAR,
    CEST,
    CFOP_CODIGO,
    OPERACAO_CODIGO,
    TABELA_PRECO_ID,
    VALOR_UNITARIO,
    VALOR_UNITARIO_PROMOCIONAL,
    QUANTIDADE_MINIMA,
    TRIBUTACAO_ORIGEM,
    TRIBUTACAO_ICMS,
    ICMS_ALIQUOTA,
    TRIBUTACAO_PIS,
    PIS_ALIQUOTA,
    TRIBUTACAO_COFINS,
    COFINS_ALIQUOTA,
    REDUCAO_BASE_PISCOF,
    TIPO_DESCONTO,
    TAM_DESCRICAO)
AS
SELECT
ESTABELECIMENTO_ID,
LOCALIZACAO_ID,
FAMILIA_ID,
MODELO_ID,
PRODUTO_ID,
PRODUTO_DESCRICAO||' '||TAM_DESCRICAO AS PRODUTO_DESCRICAO,
COR_DESCRICAO,
UM,
NCM,
EAN,
TAMANHO,
FRACIONAR,
CEST,
CFOP_CODIGO,
OPERACAO_CODIGO,
TABELA_PRECO_ID,
VALOR_UNITARIO,
CAST(FN_ARRAY(VALOR_QUANTIDADE_PROMOCIONAL,1,'|') AS NUMERIC(15,2)) VALOR_UNITARIO_PROMOCIONAL,
CAST(FN_ARRAY(VALOR_QUANTIDADE_PROMOCIONAL,2,'|') AS INTEGER) QUANTIDADE_MINIMA,
TRIBUTACAO_ORIGEM,
TRIBUTACAO_ICMS,
ICMS_ALIQUOTA,
TRIBUTACAO_PIS,
PIS_ALIQUOTA,
TRIBUTACAO_COFINS,
COFINS_ALIQUOTA,
REDUCAO_BASE_PISCOF,
TIPO_DESCONTO,
TAM_DESCRICAO

FROM (
            SELECT 
                B.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID,
                B.LOCALIZACAO_PDV AS LOCALIZACAO_ID,
                P.FAMILIA_INVENTARIO AS FAMILIA_ID,
                M.CODIGO AS MODELO_ID,
                P.CODIGO AS PRODUTO_ID,
                IIF(COALESCE(N.DESCRICAO_PDV,'') <> '' AND N.DESCRICAO_PDV <> '0', COALESCE(N.DESCRICAO_PDV,''),
                   IIF(COALESCE(M.DESCRICAO_COMERCIAL,'') <> '' AND M.DESCRICAO_COMERCIAL <> '0',
                       COALESCE(UPPER(M.DESCRICAO_COMERCIAL),'')||' '||COALESCE(UPPER(H.DESCRICAO),''),
                          COALESCE(UPPER(P.DESCRICAO),'')/*||' '||COALESCE(UPPER(H.DESCRICAO),'')*/)) PRODUTO_DESCRICAO,
                H.DESCRICAO AS COR_DESCRICAO,
                P.UNIDADEMEDIDA_SIGLA AS UM,
                P.NCM_CODIGO AS NCM,
                E.PREFIXO||E.CODIGO||COALESCE((SELECT DIGITO FROM DIGITOEAN(E.PREFIXO||E.CODIGO)),'') AS EAN,
                E.TAMANHO,

               (SELECT U.PODE_FRACIONAR FROM TBUNIDADEMEDIDA_TEMP U WHERE U.SIGLA = P.UNIDADEMEDIDA_SIGLA) FRACIONAR,
               (SELECT CEST FROM TBFAMILIA F WHERE F.CODIGO = P.FAMILIA_INVENTARIO) CEST,
                B.CFOP_CODIGO,
                B.OPERACAO_PDV AS OPERACAO_CODIGO,
                MP.TABELA_ID   AS TABELA_PRECO_ID,
                IIF(E.TAMANHO = 1 AND MP.PR_NF_01 > 0, MP.PR_NF_01,
                IIF(E.TAMANHO = 2 AND MP.PR_NF_02 > 0, MP.PR_NF_02,
                IIF(E.TAMANHO = 3 AND MP.PR_NF_03 > 0, MP.PR_NF_03,
                IIF(E.TAMANHO = 4 AND MP.PR_NF_04 > 0, MP.PR_NF_04,
                IIF(E.TAMANHO = 5 AND MP.PR_NF_05 > 0, MP.PR_NF_05,
                IIF(E.TAMANHO = 6 AND MP.PR_NF_06 > 0, MP.PR_NF_06,
                IIF(E.TAMANHO = 7 AND MP.PR_NF_07 > 0, MP.PR_NF_07,
                IIF(E.TAMANHO = 8 AND MP.PR_NF_08 > 0, MP.PR_NF_08,
                IIF(E.TAMANHO = 9 AND MP.PR_NF_09 > 0, MP.PR_NF_09,
                IIF(E.TAMANHO =10 AND MP.PR_NF_10 > 0, MP.PR_NF_10,
                IIF(E.TAMANHO =11 AND MP.PR_NF_11 > 0, MP.PR_NF_11,
                IIF(E.TAMANHO =12 AND MP.PR_NF_12 > 0, MP.PR_NF_12,
                IIF(E.TAMANHO =13 AND MP.PR_NF_13 > 0, MP.PR_NF_13,
                IIF(E.TAMANHO =14 AND MP.PR_NF_14 > 0, MP.PR_NF_14,
                IIF(E.TAMANHO =15 AND MP.PR_NF_15 > 0, MP.PR_NF_15,
                IIF(E.TAMANHO =16 AND MP.PR_NF_16 > 0, MP.PR_NF_16,
                IIF(E.TAMANHO =17 AND MP.PR_NF_17 > 0, MP.PR_NF_17,
                IIF(E.TAMANHO =18 AND MP.PR_NF_18 > 0, MP.PR_NF_18,
                IIF(E.TAMANHO =19 AND MP.PR_NF_19 > 0, MP.PR_NF_19,
                IIF(E.TAMANHO =20 AND MP.PR_NF_20 > 0, MP.PR_NF_20,
                MP.PRECO_VENDA)))))))))))))))))))) AS VALOR_UNITARIO,

                IIF(TP.TABELA_PRECO_ID_PROMOCIONAL > 0,
                COALESCE((SELECT

                    IIF(E.TAMANHO = 1 AND MPP.PR_NF_01 > 0, MPP.PR_NF_01,
                    IIF(E.TAMANHO = 2 AND MPP.PR_NF_02 > 0, MPP.PR_NF_02,
                    IIF(E.TAMANHO = 3 AND MPP.PR_NF_03 > 0, MPP.PR_NF_03,
                    IIF(E.TAMANHO = 4 AND MPP.PR_NF_04 > 0, MPP.PR_NF_04,
                    IIF(E.TAMANHO = 5 AND MPP.PR_NF_05 > 0, MPP.PR_NF_05,
                    IIF(E.TAMANHO = 6 AND MPP.PR_NF_06 > 0, MPP.PR_NF_06,
                    IIF(E.TAMANHO = 7 AND MPP.PR_NF_07 > 0, MPP.PR_NF_07,
                    IIF(E.TAMANHO = 8 AND MPP.PR_NF_08 > 0, MPP.PR_NF_08,
                    IIF(E.TAMANHO = 9 AND MPP.PR_NF_09 > 0, MPP.PR_NF_09,
                    IIF(E.TAMANHO =10 AND MPP.PR_NF_10 > 0, MPP.PR_NF_10,
                    IIF(E.TAMANHO =11 AND MPP.PR_NF_11 > 0, MPP.PR_NF_11,
                    IIF(E.TAMANHO =12 AND MPP.PR_NF_12 > 0, MPP.PR_NF_12,
                    IIF(E.TAMANHO =13 AND MPP.PR_NF_13 > 0, MPP.PR_NF_13,
                    IIF(E.TAMANHO =14 AND MPP.PR_NF_14 > 0, MPP.PR_NF_14,
                    IIF(E.TAMANHO =15 AND MPP.PR_NF_15 > 0, MPP.PR_NF_15,
                    IIF(E.TAMANHO =16 AND MPP.PR_NF_16 > 0, MPP.PR_NF_16,
                    IIF(E.TAMANHO =17 AND MPP.PR_NF_17 > 0, MPP.PR_NF_17,
                    IIF(E.TAMANHO =18 AND MPP.PR_NF_18 > 0, MPP.PR_NF_18,
                    IIF(E.TAMANHO =19 AND MPP.PR_NF_19 > 0, MPP.PR_NF_19,
                    IIF(E.TAMANHO =20 AND MPP.PR_NF_20 > 0, MPP.PR_NF_20,
                    MPP.PRECO_VENDA))))))))))))))))))))||'|'||COALESCE(MPP.QUANTIDADE_MINIMA,0)

                    FROM TBMODELO_PRECO MPP, TBTABELA_PRECO TPP
                    WHERE MPP.TABELA_ID = TPP.ID
                    AND MPP.MODELO_CODIGO = M.CODIGO
                    AND MPP.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_CODIGO
                    AND TPP.HABILITA_PDV = '1'
                    AND CURRENT_DATE BETWEEN TPP.DATA_INICIAL AND TPP.DATA_FINAL
                    AND TPP.ID = TP.TABELA_PRECO_ID_PROMOCIONAL), '0|0'), '0|0') AS VALOR_QUANTIDADE_PROMOCIONAL,

                B.CST_ORIGEM   AS TRIBUTACAO_ORIGEM,
                B.CST          AS TRIBUTACAO_ICMS,
                B.TAXA_ICMS    AS ICMS_ALIQUOTA,
                COALESCE(B.CST_PISCOF,'')  AS TRIBUTACAO_PIS,
                B.TAXA_PIS     AS PIS_ALIQUOTA,
                COALESCE(B.CST_PISCOF,'')  AS TRIBUTACAO_COFINS,
                B.TAXA_COFINS  AS COFINS_ALIQUOTA,
                C.REDUCAO_BASE_PISCOF,
                OP.TIPO_DESCONTO,
                FN_TAMANHO_GRADE(P.GRADE_CODIGO, E.TAMANHO) AS TAM_DESCRICAO

            FROM TBMODELO        M,
                 TBCOR           H,
                 TBFAMILIA_FICHA B,
                 TBMODELO_PRECO MP,
                 TBTABELA_PRECO TP,
                 TBCFOP          C,
                 TBOPERACAO     OP,
                 TBEAN           E,
                 TBPRODUTO       P
                 LEFT JOIN TBPRODUTO_FICHA N ON N.PRODUTO_CODIGO = P.CODIGO 

            WHERE MP.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_CODIGO
              AND B.FAMILIA_CODIGO          = P.FAMILIA_INVENTARIO
              AND E.MODELO_ID               = P.MODELO_CODIGO
              AND M.CODIGO                  = P.MODELO_CODIGO
              AND M.CODIGO                  = MP.MODELO_CODIGO
              AND E.COR_ID                  = P.COR_CODIGO
              AND H.CODIGO                  = P.COR_CODIGO
              AND C.CODIGO                  = B.CFOP_CODIGO
              AND OP.CODIGO                 = B.OPERACAO_PDV
              AND MP.TABELA_ID              = TP.ID
              AND P.STATUS                  = '1'  /* SOMENTE PRODUTOS ATIVOS */
              AND M.STATUS                  = '1'  /* SOMENTE MODELOS  ATIVOS */
              AND TP.HABILITA_PDV           = '1'  /* SOMENTE ITENS COM TABELA DE PREÇO HABILITADAS PARA PDV */
              AND CURRENT_DATE BETWEEN TP.DATA_INICIAL AND TP.DATA_FINAL /* SOMENTE TABELAS DE PREÇOS VIGENTES NA DATA CORRENTE */
)
;

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REMESSA_CONSUMO_TALAO (
    REMESSA_ID integer,
    REMESSA_TALAO_ID integer,
    QUANTIDADE_PRODUCAO numeric(10,5))
returns (
    CONSUMO_ID integer,
    CONSUMO_PRODUTO_ID integer,
    CONSUMO_TAMANHO integer,
    CONSUMO_FATOR_UNIDADE numeric(15,8),
    CONSUMO_QUANTIDADE_SALDO numeric(15,5),
    CONSUMO_UM varchar(10),
    CONSUMO_FAMILIA_ID integer,
    CONSUMO_LOCALIZACAO_ID integer,
    CONSUMO_PERMITE_FRACAO varchar(5),
    CONSUMO_QUANTIDADE numeric(15,5),
    ULTIMO_TALAO boolean)
as
begin

        ULTIMO_TALAO = IIF(COALESCE((
            SELECT COUNT(D.ID)
              FROM VWREMESSA_TALAO_DETALHE D
             WHERE D.REMESSA_ID = :REMESSA_ID
               AND D.REMESSA_TALAO_ID = :REMESSA_TALAO_ID
               AND D.STATUS < 2
        ),0) = 1,TRUE, FALSE);


        /* REALIZA AS BAIXAS DE CONSUMO */
        FOR
            SELECT
                C.ID,
                C.PRODUTO_ID,
                C.TAMANHO,
                C.FATOR_UNIDADE,
                C.QUANTIDADE_SALDO,
                P.UNIDADEMEDIDA_SIGLA,
                P.FAMILIA_CODIGO,
                P.LOCALIZACAO_CODIGO
            FROM
                VWREMESSA_CONSUMO C,
                TBPRODUTO P
            WHERE
                P.CODIGO = C.PRODUTO_ID
            AND C.REMESSA_ID = :REMESSA_ID
            AND C.REMESSA_TALAO_ID = :REMESSA_TALAO_ID
            AND C.STATUS = '0'
            AND C.COMPONENTE = '0'
        INTO
            CONSUMO_ID,
            CONSUMO_PRODUTO_ID,
            CONSUMO_TAMANHO,
            CONSUMO_FATOR_UNIDADE,
            CONSUMO_QUANTIDADE_SALDO,
            CONSUMO_UM,
            CONSUMO_FAMILIA_ID,
            CONSUMO_LOCALIZACAO_ID
        DO
        BEGIN

            /* VERIFICA SE O PRODUTO PERMITE BAIXA FRACIONADA */
            CONSUMO_PERMITE_FRACAO = COALESCE((
                SELECT U.PODE_FRACIONAR
                  FROM TbUnidadeMedida_temp U
                 WHERE U.SIGLA = :CONSUMO_UM),'N');

            /* REALIZA O CALCULO DE CONSUMO */
            /*
               OBS1:
                   SE FOR O ULTIMO TALAO DETALHADO A SER PRODUZIDO A BAIXA DEVE SER IGUAL AO RESTANTE A SER CONSUMIDO,
                   SENAO, DEVERA SER CALCULDO BASEADO NA QUANTIDADE DO TALAO DETALHADO.
               OBS2:
                   SE O PRODUTO NAO PERMITIR QUANTIDADE FRANCIONADA, O VALOR SERA ARREDONDADO PARA CIMA.
            */
            CONSUMO_QUANTIDADE = IIF(ULTIMO_TALAO,COALESCE(CONSUMO_QUANTIDADE_SALDO,0), COALESCE(:QUANTIDADE_PRODUCAO * CONSUMO_FATOR_UNIDADE,0));
            CONSUMO_QUANTIDADE = IIF(CONSUMO_PERMITE_FRACAO = 'S',CONSUMO_QUANTIDADE,FN_ARRENDONDAR_PARA_CIMA(CONSUMO_QUANTIDADE));


            SUSPEND;
        END

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbdefeito_trans_item_b0iu_01 for tbdefeito_transacao_item
active before insert or update position 0
AS
DECLARE VARIABLE ESTABELECIMENTO INTEGER;
DECLARE VARIABLE USUARIO_ID INTEGER;
DECLARE VARIABLE USUARIO_NOME VARCHAR(20);
DECLARE VARIABLE UM    VARCHAR(3);
DECLARE VARIABLE DESCR VARCHAR(100);
DECLARE VARIABLE FRAC  CHAR(1);
BEGIN

   USUARIO_NOME = (Select MON$USER from mon$attachments where mon$attachment_id = current_connection);

   if (:Usuario_Nome <> 'SYSDBA' and :Usuario_Nome <> 'GC') Then
       Begin

       USUARIO_ID = Coalesce((Select First 1 U.Codigo From TbUsuario U Where U.USUARIO = :USUARIO_NOME and U.Status = '1'),0);

       if (NEW.QUANTIDADE > 10000) then
           BEGIN
             Exception "..." 'QUANTIDADE INVALIDA: '||NEW.QUANTIDADE||
             ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
           END

          if (:USUARIO_ID = 0) then
              BEGIN
                  Exception "..." 'USUÁRIO INATIVO OU NÃO LOCALIZADO: '||:USUARIO_NOME||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END

        Estabelecimento = Coalesce((Select First 1 E.Estabelecimento_Codigo From TbUsuario_Estabelecimento E Where E.Usuario_Codigo = :USUARIO_ID),0);

        For Select First 1 U.SIGLA, P.DESCRICAO, U.PODE_FRACIONAR,
        IIF(:ESTABELECIMENTO>0,Coalesce((Select First 1 E.Estabelecimento_Codigo From TbUsuario_Estabelecimento E Where E.Usuario_Codigo = :USUARIO_ID and E.Estabelecimento_Codigo = New.Estabelecimento_Id),0),-1)
        From TbProduto P, TbUnidadeMedida_temp U
        Where P.Codigo = New.Produto_Id and P.Unidademedida_Sigla = U.Sigla
        Into :UM, :DESCR, :FRAC, :ESTABELECIMENTO
        Do
        Begin
          if (:ESTABELECIMENTO = 0) then
              BEGIN
                  Exception "..." 'USUARIO NAO TEM PERMISSAO DE REGISTRAR DEFEITOS DO ESTABELECIMENTO INFORMADO: '||
                  :ESTABELECIMENTO||'-'||Coalesce((Select First 1 E.NomeFantasia From TbEstabelecimento E Where E.Codigo = New.Estabelecimento_Id),'')||' -> USUÁRIO: '||:USUARIO_ID||'-'||:Usuario_Nome||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
--        if (:FAM_USUARIO = 0) then
--            BEGIN
--                Exception "..." 'USUÁRIO NÃO TEM PERMISSÃO DE REGISTRAR DEFEITOS DA FAMÍLIA DESTE PRODUTO: '||
--                :FAMILIA_ID||'-'||Coalesce((Select First 1 F.Descricao From TbFamilia F Where F.Codigo = :FAMILIA_ID),'')||' -> USUÁRIO: '||:USUARIO_ID||'-'||:Usuario_Nome||
--                ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
--            END
          if (:FRAC = 'N') then
              BEGIN
              if (NEW.QUANTIDADE > TRUNC(NEW.QUANTIDADE)) THEN
                  Exception "..." 'PRODUTO NAO PERMITE QUANTIDADE FRACIONADA: '||
                  NEW.PRODUTO_ID||'-'||:DESCR||' QUANT.'||NEW.QUANTIDADE||' '||:UM||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
          NEW.USUARIO_ID = :USUARIO_ID;
        End
     End
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbestoque_trans_item_b0iu_01 for tbestoque_transacao_item
active before insert position 0
AS
DECLARE VARIABLE ESTABELECIMENTO INTEGER;
DECLARE VARIABLE USUARIO_ID INTEGER;
DECLARE VARIABLE USUARIO_NOME VARCHAR(20);
DECLARE VARIABLE UM    VARCHAR(3);
DECLARE VARIABLE DESCR VARCHAR(200);
DECLARE VARIABLE FRAC  CHAR(1);
DECLARE VARIABLE PROD_STATUS CHAR(1);
DECLARE VARIABLE FAMILIA_ID  INTEGER;
DECLARE VARIABLE FAM_USUARIO INTEGER;
DECLARE VARIABLE FAM_OPERACAO VARCHAR(200);
DECLARE VARIABLE Loc VARCHAR(600);
declare variable Operacao_id INTEGER;
declare variable GRADE_ID INTEGER;
declare variable CCUSTO varchar(10);
BEGIN

   if (NEW.QUANTIDADE < 0 or
       NEW.T01 < 0 or NEW.T02 < 0 or NEW.T03 < 0 or NEW.T04 < 0 or NEW.T05 < 0 or
       NEW.T06 < 0 or NEW.T07 < 0 or NEW.T08 < 0 or NEW.T09 < 0 or NEW.T10 < 0 or
       NEW.T11 < 0 or NEW.T12 < 0 or NEW.T13 < 0 or NEW.T14 < 0 or NEW.T15 < 0 or
       NEW.T16 < 0 or NEW.T17 < 0 or NEW.T18 < 0 or NEW.T19 < 0 or NEW.T20 < 0) then
       BEGIN
          Exception "..." 'QUANTIDADE NAO PODE SER NEGATIVO: '||
          ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
       END

   if (New.Tipo <> 'B') then --Beneficiamento
       Begin
       OPERACAO_ID = Coalesce((Select First 1 O.ID From TbOperacao O
                            Where O.Codigo = New.Operacao_Codigo
                              and O.Tipo   = New.Tipo
                              and O.NotaFiscal = IIF(new.nfe_item_controle>0 or New.Nfs_item_controle > 0,'1','0')),0);
       End else
       Begin
       OPERACAO_ID = Coalesce((Select First 1 O.ID From TbOperacao O
                            Where O.Codigo = New.Operacao_Codigo
                              and O.NotaFiscal = IIF(new.nfe_item_controle>0 or New.Nfs_item_controle > 0,'1','0')),0);
       End

   if (:OPERACAO_ID = 0) then
       BEGIN
          Exception "..." 'OPERACAO INVALIDA OU NAO CADASTRADA: '||coalesce(New.Operacao_Codigo,'')||
          ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
       END

   USUARIO_NOME = (Select MON$USER from mon$attachments where mon$attachment_id = current_connection);
   USUARIO_NOME = current_user;

   if (:Usuario_Nome <> 'SYSDBA' and :Usuario_Nome <> 'GC') Then
       Begin

       USUARIO_ID = Coalesce((Select First 1 U.Codigo From TbUsuario U Where U.USUARIO = :USUARIO_NOME and U.Status = '1'),0);

          if (:USUARIO_ID = 0) then
              BEGIN
                  Exception "..." 'USUARIO INATIVO OU NAO CADASTRADO: '||:USUARIO_NOME||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END

        Estabelecimento = Coalesce((Select First 1 E.Estabelecimento_Codigo From TbUsuario_Estabelecimento E Where E.Usuario_Codigo = :USUARIO_ID),0);
        if (New.Nfs_Item_Controle > 0 or New.Nfe_Item_Controle > 0) then
            Begin
            Fam_Operacao = '';
            End else
            Begin
            Fam_Operacao = Coalesce((Select First 1 O.Familias From TbOperacao O Where O.Codigo = New.Operacao_Codigo),'');
            End

        For
        Select First 1
        U.SIGLA,
        P.DESCRICAO,
        U.PODE_FRACIONAR,
        P.FAMILIA_CODIGO,
        Coalesce((Select First 1 F.Familia_Id From Tbusuario_Familia F Where F.Familia_Id = P.Familia_Codigo and F.Usuario_Id = :USUARIO_ID),0),
        Coalesce((Select First 1 C.Valor_Ext From TbControle_Usuario C Where C.Usuario_Id = :USUARIO_ID and C.Id = 127),''),
        IIF(:ESTABELECIMENTO>0,Coalesce((Select First 1 E.Estabelecimento_Codigo From TbUsuario_Estabelecimento E Where E.Usuario_Codigo = :USUARIO_ID and E.Estabelecimento_Codigo = New.Estabelecimento_Codigo),0),-1),
        P.STATUS,
        P.GRADE_CODIGO,
        Coalesce((Select First 1 L.CCusto From TbLocalizacao L Where L.Codigo = New.Localizacao_Codigo),'')
        From TbProduto P, TbUnidadeMedida_temp U
        Where P.Codigo = New.Produto_Codigo and P.Unidademedida_Sigla = U.Sigla
        Into :UM, :DESCR, :FRAC, :FAMILIA_ID, :FAM_USUARIO, :Loc, :ESTABELECIMENTO, :PROD_STATUS, :GRADE_ID, :CCUSTO
        Do
        Begin
          if (:PROD_STATUS <> '1') then
              BEGIN
                Exception "..." 'TRANSACAO DE ESTOQUE NAO PERMITIDA PARA PRODUTO INATIVO, PRODUTO:'||coalesce(New.Produto_Codigo,0)||'  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END

           if (:GRADE_ID > 0) Then
               begin
               if (NEW.T01 + NEW.T02 + NEW.T03 + NEW.T04 + NEW.T05 +
                   NEW.T06 + NEW.T07 + NEW.T08 + NEW.T09 + NEW.T10 +
                   NEW.T11 + NEW.T12 + NEW.T13 + NEW.T14 + NEW.T15 +
                   NEW.T16 + NEW.T17 + NEW.T18 + NEW.T19 + NEW.T20 <= 0) then
                   BEGIN
                   Exception "..." 'PRODUTO COM GRADE, EXIGE QUANTIDADE EM ALGUM TAMANHO! PROD.'||NEW.PRODUTO_CODIGO||' QUANT.'||NEW.QUANTIDADE||' OPER.'||NEW.OPERACAO_CODIGO||'. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                   END
               End else
           if (:GRADE_ID = 0) Then
               begin
               if (NEW.T01 + NEW.T02 + NEW.T03 + NEW.T04 + NEW.T05 +
                   NEW.T06 + NEW.T07 + NEW.T08 + NEW.T09 + NEW.T10 +
                   NEW.T11 + NEW.T12 + NEW.T13 + NEW.T14 + NEW.T15 +
                   NEW.T16 + NEW.T17 + NEW.T18 + NEW.T19 + NEW.T20 > 0) then
                   BEGIN
                   Exception "..." 'PRODUTO SEM GRADE, NAO HA NECESSIDADE DE QUANTIDADE POR TAMANHO! '||
                   ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                   END
               End

          if (:ESTABELECIMENTO = 0) then
              BEGIN
                  Exception "..." 'USUARIO NAO TEM PERMISSAO DE MOVIMENTAR ESTOQUE DO ESTABELECIMENTO INFORMADO: '||
                  :ESTABELECIMENTO||'-'||Coalesce((Select First 1 E.NomeFantasia From TbEstabelecimento E Where E.Codigo = New.Estabelecimento_Codigo),'')||' -> USUARIO: '||:USUARIO_ID||'-'||:Usuario_Nome||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
          if (Position(lPad(New.Localizacao_Codigo,2,'0'),:LOC) = 0) Then
              BEGIN
                Exception "..." 'USUARIO NAO TEM PERMISSAO DE MOVIMENTAR ESTOQUE COM A LOCALIZACAO INFORMADA: '||New.Localizacao_Codigo||'-'||
                Coalesce((Select First 1 L.Descricao From TbLocalizacao L Where L.Codigo = New.Localizacao_Codigo),'')||' -> USUARIO: '||:USUARIO_ID||'-'||:Usuario_Nome||
                ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
          if (:FAM_USUARIO = 0) then
              BEGIN
                  Exception "..." 'USUARIO NAO TEM PERMISSAO DE MOVIMENTAR ESTOQUE DA FAMILIA DESTE PRODUTO: '||
                  :FAMILIA_ID||'-'||Coalesce((Select First 1 F.Descricao From TbFamilia F Where F.Codigo = :FAMILIA_ID),'')||' -> USUARIO: '||:USUARIO_ID||'-'||:Usuario_Nome||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
          if (:FRAC = 'N') then
              BEGIN
              if (NEW.QUANTIDADE > TRUNC(NEW.QUANTIDADE)) THEN
                  Exception "..." 'PRODUTO NAO PERMITE QUANTIDADE FRACIONADA: '||
                  NEW.PRODUTO_CODIGO||'-'||:DESCR||' QUANT.'||NEW.QUANTIDADE||' '||:UM||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
          if (:FAM_OPERACAO <> '' and Position(lPad(:FAMILIA_ID,4,'0'),:FAM_OPERACAO) = 0) then
              BEGIN
                  Exception "..." 'OPERACAO NAO PODE SER USADA COM A FAMILIA DE PRODUTOS INFORMADA.'||
                  'OPERACAO: '||NEW.OPERACAO_CODIGO||'- FAMILIA: '||:FAMILIA_ID||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END

          if ((COALESCE(NEW.CENTRO_DE_CUSTO, '') = '') AND (COALESCE(:CCUSTO, '') <> '')) then
              BEGIN
              NEW.CENTRO_DE_CUSTO = :CCUSTO;
              END

          NEW.USUARIO_CODIGO = :USUARIO_ID;
        End
     End
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttboc_item_b0iu_01 for tboc_item
active before insert or update position 0
AS
DECLARE VARIABLE UM VARCHAR(3);
DECLARE VARIABLE DESCR VARCHAR(100);
DECLARE VARIABLE FRAC CHAR(1);
DECLARE VARIABLE LOC1 INTEGER;
DECLARE VARIABLE LOC2 INTEGER;


BEGIN


For
    Select First 1
        coalesce(U.SIGLA,'') as SIGLA,
        P.DESCRICAO,
        U.PODE_FRACIONAR,
        P.LOCALIZACAO_CODIGO,
        (SELECT FIRST 1 F.LOCALIZACAO_CODIGO FROM TBFAMILIA F WHERE F.CODIGO = P.FAMILIA_CODIGO)
    From TbProduto P
    left join TbUnidadeMedida_temp U on P.Unidademedida_Sigla = U.Sigla
    Where P.Codigo = New.Produto_Codigo
    Into
        :UM,
        :DESCR,
        :FRAC,
        :LOC1,
        :LOC2
Do
Begin

  if(UM = '')then
  begin
     exception "..." 'Unidades de medida do produto nao foi encontrada. Produto:' || New.Produto_Codigo;
  end

  if (New.Controle > 0) then
      Begin
      /* Trigger text */

      if ((NEW.VALOR * NEW.QUANTIDADE) + NEW.ACRESCIMO - NEW.DESCONTO < 0) THEN
          Exception "..." 'VALOR TOTAL DO ITEM INVALIDO, NAO PODE SER NEGATIVO! '||
          NEW.PRODUTO_CODIGO||'-'||:DESCR||
          ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';


      if (:FRAC = 'N') then
          BEGIN
          if (NEW.QUANTIDADE > TRUNC(NEW.QUANTIDADE)) THEN
              Exception "..." 'PRODUTO NAO PERMITE QUANTIDADE FRACIONADA: '||
              NEW.PRODUTO_CODIGO||'-'||:DESCR||' QUANT.'||NEW.QUANTIDADE||' '||:UM||
              ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
          END
    
       if (Coalesce(New.Localizacao_Codigo,0) = 0) then
           Begin
           if (:Loc1 > 0) then
               Begin
               New.Localizacao_Codigo = :Loc1;
               End else
           if (:Loc2 > 0) then
               Begin
               New.Localizacao_Codigo = :Loc2;
               End else
               Begin
               Exception "..." 'LOCALIZACAO PADRAO DE ESTOQUE DO PRODUTO NAO LOCALIZADA '||
               NEW.PRODUTO_CODIGO||'-'||:DESCR||
               ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
               End
           End


    if (Inserting) then
        Begin
            UPDATE OR INSERT INTO TbOc_Item_Saldo (
            Oc,Oc_Item_Controle,Quantidade,        
            T01,T02,T03,T04,T05,T06,T07,T08,T09,T10,
            T11,T12,T13,T14,T15,T16,T17,T18,T19,T20)
            VALUES (NEW.OC,NEW.CONTROLE,NEW.QUANTIDADE,
            NEW.T01,NEW.T02,NEW.T03,NEW.T04,NEW.T05,NEW.T06,NEW.T07,NEW.T08,NEW.T09,NEW.T10,
            NEW.T11,NEW.T12,NEW.T13,NEW.T14,NEW.T15,NEW.T16,NEW.T17,NEW.T18,NEW.T19,NEW.T20)
            MATCHING (Oc,Oc_Item_Controle);
        End

    if (Updating) then
        Begin
        --EXCEPTION "..."NEW.QUANTIDADE||' - '||OLD.QUANTIDADE;   6 -> 3

        if (NEW.QUANTIDADE <> OLD.QUANTIDADE or
            NEW.T01 <> OLD.T01 or NEW.T02 <> OLD.T02 or
            NEW.T03 <> OLD.T03 or NEW.T04 <> OLD.T04 or
            NEW.T05 <> OLD.T05 or NEW.T06 <> OLD.T06 or
            NEW.T07 <> OLD.T07 or NEW.T08 <> OLD.T08 or
            NEW.T09 <> OLD.T09 or NEW.T10 <> OLD.T10 or
            NEW.T11 <> OLD.T11 or NEW.T12 <> OLD.T12 or
            NEW.T13 <> OLD.T13 or NEW.T14 <> OLD.T14 or
            NEW.T15 <> OLD.T15 or NEW.T16 <> OLD.T16 or
            NEW.T17 <> OLD.T17 or NEW.T18 <> OLD.T18 or
            NEW.T19 <> OLD.T19 or NEW.T20 <> OLD.T20) then
            Begin
                --UPDATE OR INSERT INTO TbOc_Item_Saldo T (
                --Oc,Oc_Item_Controle,Quantidade,
                --T01,T02,T03,T04,T05,T06,T07,T08,T09,T10,
                --T11,T12,T13,T14,T15,T16,T17,T18,T19,T20)
                --VALUES (NEW.OC,NEW.CONTROLE, NEW.QUANTIDADE ,
                --NEW.T01,NEW.T02,NEW.T03,NEW.T04,NEW.T05,NEW.T06,NEW.T07,NEW.T08,NEW.T09,NEW.T10,
                --NEW.T11,NEW.T12,NEW.T13,NEW.T14,NEW.T15,NEW.T16,NEW.T17,NEW.T18,NEW.T19,NEW.T20)
                --MATCHING (Oc,Oc_Item_Controle);
                UPDATE TBOC_ITEM_SALDO T
                SET OC = NEW.OC,
                    QUANTIDADE  =  T.QUANTIDADE - (OLD.QUANTIDADE - NEW.QUANTIDADE),
                    T01         =  T.T01 - (OLD.T01 - NEW.T01),
                    T02         =  T.T02 - (OLD.T02 - NEW.T02),
                    T03         =  T.T03 - (OLD.T03 - NEW.T03),
                    T04         =  T.T04 - (OLD.T04 - NEW.T04),
                    T05         =  T.T05 - (OLD.T05 - NEW.T05),
                    T06         =  T.T06 - (OLD.T06 - NEW.T06),
                    T07         =  T.T07 - (OLD.T07 - NEW.T07),
                    T08         =  T.T08 - (OLD.T08 - NEW.T08),
                    T09         =  T.T09 - (OLD.T09 - NEW.T09),
                    T10         =  T.T10 - (OLD.T10 - NEW.T10),
                    T11         =  T.T11 - (OLD.T11 - NEW.T11),
                    T12         =  T.T12 - (OLD.T12 - NEW.T12),
                    T13         =  T.T13 - (OLD.T13 - NEW.T13),
                    T14         =  T.T14 - (OLD.T14 - NEW.T14),
                    T15         =  T.T15 - (OLD.T15 - NEW.T15),
                    T16         =  T.T16 - (OLD.T16 - NEW.T16),
                    T17         =  T.T17 - (OLD.T17 - NEW.T17),
                    T18         =  T.T18 - (OLD.T18 - NEW.T18),
                    T19         =  T.T19 - (OLD.T19 - NEW.T19),
                    T20         =  T.T20 - (OLD.T20 - NEW.T20)
                WHERE (OC_ITEM_CONTROLE = NEW.CONTROLE);

            End
        End

    End

End

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpdv_devolucao_troca_b03i for tbpdv_devolucao_troca
inactive before insert or update or delete position 2
AS

/* INATIVA POIS É NECESSÁRIO BAIXAR SALDO APENAS COM A NOTA DE ENTRADA DE DEVOLUÇÃO  */
DECLARE VARIABLE NFS_CONTROLE         INTEGER;
DECLARE VARIABLE NUMERO_CFE           INTEGER;
DECLARE VARIABLE ITEM_ID              INTEGER;
DECLARE VARIABLE QUANTIDADE           NUMERIC(15,8);
DECLARE VARIABLE QUANTIDADE_ITEM_NFS  NUMERIC(15,8);
DECLARE VARIABLE SALDO_ATUALIZADO     NUMERIC(15,8);
begin
 IF(INSERTING) THEN
 BEGIN
     IF(NEW.TIPO_DOCUMENTO = 1)THEN
     BEGIN
        FOR SELECT
            a.nfs_controle,
            a.CONTROLE,
            t.QUANTIDADE,
            a.quantidade as quantidade_item_nfs,
            Z.QUANTIDADE - t.quantidade saldo_atualizado
        
            FROM TBPDV_DEVOLUCAO_TROCA_ITEM T
            INNER JOIN TBNFS            C ON C.CONTROLE          = T.DOCUMENTO_CONTROLE
            LEFT  JOIN TBNFS_ITEM       A ON A.NFS_CONTROLE      = C.CONTROLE AND A.SEQUENCIA = T.ITEM_SEQUENCIA
            LEFT  JOIN TBNFS_ITEM_SALDO Z ON A.NFS_CONTROLE      = Z.NFS_CONTROLE AND A.CONTROLE = Z.NFS_ITEM_CONTROLE
            INNER JOIN TBPRODUTO        B ON B.CODIGO            = A.PRODUTO_CODIGO
            LEFT  JOIN TBMODELO         D ON D.CODIGO            = B.MODELO_CODIGO
            LEFT  JOIN TBUNIDADEMEDIDA_TEMP  E ON E.SIGLA             = B.UNIDADEMEDIDA_SIGLA
                    
            WHERE T.PDV_DEVOLUCAO_ID = NEW.ID
            AND C.EMPRESA_CODIGO     = NEW.CLIENTE_ID
            AND A.NFS_CONTROLE       = C.CONTROLE
            INTO :NFS_CONTROLE,
                 :ITEM_ID,
                 :QUANTIDADE,
                 :QUANTIDADE_ITEM_NFS,
                 :SALDO_ATUALIZADO
            DO
            BEGIN
               UPDATE TBNFS_ITEM_SALDO A SET A.QUANTIDADE = :SALDO_ATUALIZADO WHERE A.NFS_CONTROLE = :NFS_CONTROLE AND A.NFS_ITEM_CONTROLE = :ITEM_ID;
            END
     END
     ELSE
     BEGIN
        FOR SELECT A.PDV_CFE_ID,
                A.ID,
                T.QUANTIDADE,
                A.QUANTIDADE  as quantidade_item_nfs,
                (X.QUANTIDADE - t.quantidade) saldo_atualizado
            
                FROM TBPDV_DEVOLUCAO_TROCA_ITEM T
                LEFT  JOIN TBPDV_CFE_ITEM       A ON A.SEQUENCIA  = T.ITEM_SEQUENCIA
                LEFT  JOIN TBPDV_CFE_ITEM_SALDO X ON X.PDV_CFE_ITEM_ID = A.ID AND X.PDV_CFE_ID = A.PDV_CFE_ID
                INNER JOIN TBPRODUTO            B ON B.CODIGO     = A.PRODUTO_ID
                INNER JOIN TBPDV_CFE            C ON C.ID         = T.DOCUMENTO_CONTROLE
                LEFT  JOIN TBMODELO             D ON D.CODIGO     = B.MODELO_CODIGO
                LEFT  JOIN TBUNIDADEMEDIDA_TEMP      E ON E.SIGLA      = B.UNIDADEMEDIDA_SIGLA
            
                WHERE T.PDV_DEVOLUCAO_ID = NEW.ID
                AND A.PDV_CFE_ID         = C.ID
                AND C.CLIENTE_ID         = NEW.CLIENTE_ID
        INTO :NFS_CONTROLE,
             :ITEM_ID,
             :QUANTIDADE,
             :QUANTIDADE_ITEM_NFS,
             :SALDO_ATUALIZADO
        DO
        BEGIN
           UPDATE TBPDV_CFE_ITEM_SALDO A SET A.QUANTIDADE = :SALDO_ATUALIZADO WHERE A.PDV_CFE_ID = :NFS_CONTROLE AND A.PDV_CFE_ITEM_ID = :ITEM_ID;
        END
     END
 END
 IF(DELETING)THEN
 BEGIN
  IF(OLD.TIPO_DOCUMENTO = 1)THEN
     BEGIN
        FOR SELECT
            a.nfs_controle,
            a.CONTROLE,
            t.QUANTIDADE,
            a.quantidade as quantidade_item_nfs,
            (t.quantidade) saldo_atualizado
        
            FROM TBPDV_DEVOLUCAO_TROCA_ITEM T
            INNER JOIN TBNFS           C ON C.CONTROLE          = T.DOCUMENTO_CONTROLE
            LEFT  JOIN TBNFS_ITEM      A ON A.NFS_CONTROLE      = C.CONTROLE AND A.SEQUENCIA = T.ITEM_SEQUENCIA
            INNER JOIN TBPRODUTO       B ON B.CODIGO            = A.PRODUTO_CODIGO
            LEFT  JOIN TBMODELO        D ON D.CODIGO            = B.MODELO_CODIGO
            LEFT  JOIN TBUNIDADEMEDIDA_TEMP E ON E.SIGLA             = B.UNIDADEMEDIDA_SIGLA
                    
            WHERE T.PDV_DEVOLUCAO_ID = OLD.ID
            AND C.EMPRESA_CODIGO     = OLD.CLIENTE_ID
            AND A.NFS_CONTROLE       = C.CONTROLE
            INTO :NFS_CONTROLE,
                 :ITEM_ID,
                 :QUANTIDADE,
                 :QUANTIDADE_ITEM_NFS,
                 :SALDO_ATUALIZADO
            DO
            BEGIN
               UPDATE TBNFS_ITEM_SALDO A SET A.QUANTIDADE = (A.QUANTIDADE + :SALDO_ATUALIZADO) WHERE A.NFS_CONTROLE = :NFS_CONTROLE AND A.NFS_ITEM_CONTROLE = :ITEM_ID;
            END
     END
     ELSE
     BEGIN
        FOR SELECT A.PDV_CFE_ID,
                A.ID,
                T.QUANTIDADE,
                A.QUANTIDADE as quantidade_item_nfs,
                (t.quantidade) saldo_atualizado
            
                FROM TBPDV_DEVOLUCAO_TROCA_ITEM T
                LEFT  JOIN TBPDV_CFE_ITEM       A ON A.SEQUENCIA  = T.ITEM_SEQUENCIA
                INNER JOIN TBPRODUTO            B ON B.CODIGO     = A.PRODUTO_ID
                INNER JOIN TBPDV_CFE            C ON C.ID         = T.DOCUMENTO_CONTROLE
                LEFT  JOIN TBMODELO             D ON D.CODIGO     = B.MODELO_CODIGO
                LEFT  JOIN TBUNIDADEMEDIDA_TEMP      E ON E.SIGLA      = B.UNIDADEMEDIDA_SIGLA
            
                WHERE T.PDV_DEVOLUCAO_ID = OLD.ID
                AND A.PDV_CFE_ID         = C.ID
                AND C.CLIENTE_ID         = OLD.CLIENTE_ID
        INTO :NFS_CONTROLE,
             :ITEM_ID,
             :QUANTIDADE,
             :QUANTIDADE_ITEM_NFS,
             :SALDO_ATUALIZADO
        DO
        BEGIN
           UPDATE TBPDV_CFE_ITEM_SALDO A SET A.QUANTIDADE = (A.QUANTIDADE + :SALDO_ATUALIZADO) WHERE A.PDV_CFE_ID = :NFS_CONTROLE AND A.PDV_CFE_ITEM_ID = :ITEM_ID;
        END
     END
 END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_item_b0i_00 for tbpedido_item
active before insert position 0
AS
DECLARE VARIABLE UM VARCHAR(3);
DECLARE VARIABLE DESCR VARCHAR(100);
DECLARE VARIABLE FRAC CHAR(1);
DECLARE VARIABLE LOC1 INTEGER;
DECLARE VARIABLE LOC2 INTEGER;
BEGIN
For Select First 1 U.SIGLA, P.DESCRICAO, U.PODE_FRACIONAR, P.LOCALIZACAO_CODIGO,
(SELECT FIRST 1 F.LOCALIZACAO_CODIGO FROM TBFAMILIA F WHERE F.CODIGO = P.FAMILIA_CODIGO)
From TbProduto P, TbUnidadeMedida_temp U
Where P.Codigo = New.Produto_Codigo and P.Unidademedida_Sigla = U.Sigla
Into :UM, :DESCR, :FRAC, :LOC1, :LOC2
Do
Begin

  if (:FRAC = 'N') then
      BEGIN
      if (NEW.QUANTIDADE > TRUNC(NEW.QUANTIDADE)) THEN
          Exception "..." 'PRODUTO NÃO PERMITE QUANTIDADE FRACIONADA: '||
          NEW.PRODUTO_CODIGO||'-'||:DESCR||' QUANT.'||NEW.QUANTIDADE||' '||:UM||
          ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
      END

   if (Coalesce(New.Localizacao_ID,0) = 0) then
       Begin
       if (:Loc1 > 0) then
           Begin
           New.Localizacao_ID = :Loc1;
           End else
       if (:Loc2 > 0) then
           Begin
           New.Localizacao_ID = :Loc2;
           End else
           Begin
           Exception "..." 'LOCALIZAÇÃO PADRÃO DE ESTOQUE DO PRODUTO NÃO LOCALIZADA '||
           NEW.PRODUTO_CODIGO||'-'||:DESCR||
           ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
           End
       End
End

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_item_b0u_00 for tbpedido_item
active before update position 0
AS
DECLARE VARIABLE UM VARCHAR(3);
DECLARE VARIABLE DESCR VARCHAR(100);
DECLARE VARIABLE FRAC CHAR(1);
DECLARE VARIABLE LOC1 INTEGER;
DECLARE VARIABLE LOC2 INTEGER;
BEGIN

  if (New.Quantidade <> Old.Quantidade or
      New.Produto_Codigo <> Old.Produto_Codigo) Then
      Begin

        For Select First 1 U.SIGLA, P.DESCRICAO, U.PODE_FRACIONAR, P.LOCALIZACAO_CODIGO,
        (SELECT FIRST 1 F.LOCALIZACAO_CODIGO FROM TBFAMILIA F WHERE F.CODIGO = P.FAMILIA_CODIGO)
        From TbProduto P, TbUnidadeMedida_temp U
        Where P.Codigo = New.Produto_Codigo and P.Unidademedida_Sigla = U.Sigla
        Into :UM, :DESCR, :FRAC, :LOC1, :LOC2
        Do
        Begin
          if (:FRAC = 'N') then
              BEGIN
              if (NEW.QUANTIDADE > TRUNC(NEW.QUANTIDADE)) THEN
                  Exception "..." 'PRODUTO NÃO PERMITE QUANTIDADE FRACIONADA: '||
                  NEW.PRODUTO_CODIGO||'-'||:DESCR||' QUANT.'||NEW.QUANTIDADE||' '||:UM||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
          if (Coalesce(New.Localizacao_ID,0) = 0) then
              Begin
               if (:Loc1 > 0) then
                   Begin
                   New.Localizacao_ID = :Loc1;
                   End else
               if (:Loc2 > 0) then
                   Begin
                   New.Localizacao_ID = :Loc2;
                   End else
                   Begin
                   Exception "..." 'LOCALIZAÇÃO PADRÃO DE ESTOQUE DO PRODUTO NÃO LOCALIZADA '||
                   NEW.PRODUTO_CODIGO||'-'||:DESCR||
                   ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                   End
              End
        End
      End
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_item_processado_b8u for tbpedido_item_processado
active before update position 8
AS
declare variable REMESSA_WEB VARCHAR(10);
declare variable REMESSA VARCHAR(15);
declare variable REMESSA_FAMILIA_ID INTEGER;
declare variable TALAO_ID INTEGER;
declare variable TALAO_GP_ID INTEGER;
declare variable TALAO_UP_ID INTEGER;
declare variable TALAO_ESTACAO INTEGER;
declare variable TALAO_LOCALIZACAO_ID INTEGER;   
declare variable TALAO_ESTOQUE_ID INTEGER;
declare variable PROGRAMACAO_STATUS VARCHAR(10);
declare variable PROGRAMACAO_ID INTEGER;
declare variable OPERACAO_ENTRADA VARCHAR(255);
declare variable UP_PERFIL VARCHAR(10);
declare variable UP_CCUSTO VARCHAR(10);
declare variable CONSUMO_ID INTEGER;
declare variable CONSUMO_PRODUTO_ID INTEGER;
declare variable CONSUMO_TAMANHO INTEGER;
declare variable CONSUMO_FATOR_UNIDADE NUMERIC(15,8);
declare variable CONSUMO_LOCALIZACAO_ID INTEGER;
declare variable CONSUMO_ESTOQUE_ID INTEGER;    
declare variable CONSUMO_QUANTIDADE NUMERIC(15,5);    
declare variable CONSUMO_QUANTIDADE_SALDO NUMERIC(15,5);
declare variable CONSUMO_UM VARCHAR(10);                
declare variable CONSUMO_FAMILIA_ID INTEGER;
declare variable CONSUMO_PERMITE_FRACAO VARCHAR(5);
declare variable ULTIMO_TALAO BOOLEAN;
declare variable PRODUCAO_TOTAL BOOLEAN;
declare variable CONSUMO_PRODUTO_TALAO INTEGER;
begin

    SELECT FIRST 1
           R.REMESSA,
           COALESCE(WEB,'0'),
           R.FAMILIA_ID
      FROM VWREMESSA R
     WHERE R.REMESSA_ID = NEW.REMESSA
     INTO REMESSA,
          REMESSA_WEB,
          REMESSA_FAMILIA_ID;

    IF ( REMESSA_WEB = '2' ) THEN
    BEGIN
        /* FINALIZANDO O TALAO DETALHADO */
        IF ( OLD.SITUACAO < 2 AND NEW.SITUACAO = 2 ) THEN
        BEGIN
    
            SELECT FIRST 1
                   T.ID,
                   T.GP_ID,
                   T.UP_ID,
                   T.ESTACAO
              FROM VWREMESSA_TALAO T
             WHERE T.REMESSA_ID = NEW.REMESSA
               AND T.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
              INTO TALAO_ID,
                   TALAO_GP_ID,
                   TALAO_UP_ID,
                   TALAO_ESTACAO;
            /*
            IF ( NOT FN_GP_REMESSA_LIBERADA(NEW.REMESSA,:TALAO_GP_ID,:TALAO_UP_ID) ) THEN
            BEGIN
                EXCEPTION "..." 'REMESSA BLOQUEADA PARA PRODUCAO.';
            END
            */
    
            /* VERIFICA SE EH O ULTIMO TALAO DA SEQUENCIA */
            ULTIMO_TALAO = IIF(COALESCE((
                SELECT COUNT(D.ID)
                  FROM VWREMESSA_TALAO_DETALHE D
                 WHERE D.REMESSA_ID = NEW.REMESSA
                   AND D.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
                   AND D.STATUS < 2
            ),0) = 1,TRUE, FALSE);
    
            SELECT ID,
                   STATUS
              FROM TBPROGRAMACAO P
             WHERE P.TABELA_ID = :TALAO_ID
               AND P.TIPO = 'A'
              INTO PROGRAMACAO_ID,
                   PROGRAMACAO_STATUS;
    
            IF ( PROGRAMACAO_STATUS <> '2' ) THEN
            BEGIN
                EXCEPTION "..." 'O talão('||:TALAO_ID||') não está em produção. Operação cancelada.';
            END
    
            /* SE FOR O ULTIMO TALAO, ATUALIZA O TALAO ACUMULADO PARA PRODUZIDO E A PROGRAMACAO PARA FINALIZADO */
            IF ( ULTIMO_TALAO ) THEN
            BEGIN
                          
                UPDATE TBPROGRAMACAO P
                   SET P.STATUS = '3',
                       P.DATAHORA_FINALIZADO = iif(coalesce(p.flag_data,0) = 0, CURRENT_TIMESTAMP, P.DATAHORA_FINALIZADO)
                 WHERE P.TABELA_ID = :TALAO_ID
                   AND P.TIPO      = 'A';
    
                INSERT INTO TBPROGRAMACAO_REGISTRO (
                    PROGRAMACAO_ID,
                    STATUS,
                    OPERADOR_ID
                ) VALUES (
                   :PROGRAMACAO_ID,       
                   2,
                   NEW.OPERADOR_ID_PRODUCAO
                );
    
                UPDATE VWREMESSA_TALAO T
                   SET T.STATUS = 2,
                       T.DATA_PRODUCAO = FN_DATA_PRODUCAO()
                 WHERE T.ID     = :TALAO_ID;
    
    --            UPDATE TBUP_ESTACAO
    --               SET TALAO_ID = 0,
    --                   INCREMENTO = 1
    --             WHERE (UP_ID = :TALAO_UP_ID) AND (ID = :TALAO_ESTACAO);
    
                
                EXECUTE PROCEDURE SPU_PROCESSAR_TEMPO_REALIZAD_V2((
                    SELECT FIRST 1 ID
                      FROM TBPROGRAMACAO P
                     WHERE P.TABELA_ID = :TALAO_ID));
    
                EXECUTE PROCEDURE SPU_PROGRAMACAO_PRODUZIDO1(
                    NEW.ESTABELECIMENTO_CODIGO,
                    'A',
                    :TALAO_ID
                );
            END
    
            /* CAPTURA A LOCALIZACAO DE ENTRADA NO ESTOQUE */
            TALAO_LOCALIZACAO_ID = COALESCE(( SELECT FIRST 1 P.LOCALIZACAO_CODIGO FROM TBPRODUTO P WHERE P.CODIGO = NEW.PRODUTO_CODIGO ),0);
            
            /* CAPTURA A OPERACAO DE ESTOQUE */
            OPERACAO_ENTRADA = (SELECT FIRST 1 VALOR_EXT FROM TBCONTROLE_N WHERE ID = 30);
            
            /* CAPTURA O CCUSTO DA TRANSACAO */
            SELECT FIRST 1
                   U.CCUSTO,
                   U.PERFIL
              FROM TBUP U
             WHERE U.ID = :TALAO_UP_ID
              INTO UP_CCUSTO,
                   UP_PERFIL;
            

            
            NEW.ESTEIRA_PRODUCAO = TALAO_GP_ID;
            NEW.SETOR_CODIGO     = TALAO_UP_ID;
    
            /* GUARDA DATA E HORA DE PRODUCAO */
            NEW.HORA_PRODUCAO = CURRENT_TIMESTAMP;
    
            /* GUARDA DATA DE PRODUCAO DO TURNO CORRENTE */
            NEW.DATA_PRODUCAO =  FN_DATA_PRODUCAO();

            /* ATUALIZA A QUANTIDADE PRODUZIDA NO TALAO DETALHADO */
            IF ( NOT (COALESCE(NEW.QUANTIDADE_PRODUCAO,0) > 0) ) THEN
            BEGIN
                NEW.QUANTIDADE_PRODUCAO = NEW.QUANTIDADE_PEDIDO;
            END

            IF ( NEW.QUANTIDADE_PRODUCAO <> NEW.QUANTIDADE_PEDIDO ) THEN
            BEGIN
                FN_OPERADOR_AUTENTICACAO(NEW.OPERADOR_ID_PRODUCAO,34); /* REGISTRAR PRODUCAO PARCIAL */
            END

            NEW.QUANTIDADE_SALDO    = NEW.QUANTIDADE_PRODUCAO;


            PRODUCAO_TOTAL = COALESCE((SELECT IIF(SUM(P.QUANTIDADE_PEDIDO) = (SUM(P.QUANTIDADE_PRODUCAO)+NEW.QUANTIDADE_PRODUCAO),TRUE,FALSE)
                                             FROM TBPEDIDO_ITEM_PROCESSADO P
                                            WHERE P.REMESSA = NEW.REMESSA
                                              AND P.REMESSA_ACUMULADO_CONTROLE = NEW.REMESSA_ACUMULADO_CONTROLE),TRUE);
    
    
    ---------------- NAO SERA MAIS APLICADO --------------
    ---------- ENTRADA VIA CONFERENCIA DO COLETOR --------
    ------------------------------------------------------    
    --        /* GERA O ID DA TRANSACAO DE ENTRADA NO ESTOQUE */
    --        TALAO_ESTOQUE_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
    --        /* GUARDA O ID DA TRANSACAO DE ESTOQUE NO TALAO DETALHADO */
    --        NEW.ESTOQUE_ID = :TALAO_ESTOQUE_ID;
    --        /* REGISTRA A ENTRADA NO ESTOQUE DO TALAO DETALHADO */
    --        EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO(
    --            'TBPEDIDO_ITEM_PROCESSADO',
    --            0,
    --            NEW.CONTROLE,
    --            NEW.ESTABELECIMENTO_CODIGO,
    --            :TALAO_LOCALIZACAO_ID,
    --            NEW.DATA_PRODUCAO,
    --            NEW.PRODUTO_CODIGO,
    --            NEW.TAMANHO,
    --            NEW.QUANTIDADE_PRODUCAO,
    --            'E',
    --            OPERACAO_ENTRADA,
    --            '0',
    --            :CCUSTO,
    --            'WEB22180 - ENTRADA POR REMESSA DE PRODUCAO',
    --            NEW.ESTOQUE_ID
    --        );
    
        
    
            /* REALIZA AS BAIXAS DE CONSUMO GERAL AO TALAO */
            FOR
                SELECT
                    C.ID,
                    C.PRODUTO_ID,
                    C.TAMANHO,
                    C.FATOR_UNIDADE,
                    C.QUANTIDADE_SALDO,
                    P.UNIDADEMEDIDA_SIGLA,
                    P.FAMILIA_CODIGO,
                    P.LOCALIZACAO_CODIGO
                FROM
                    VWREMESSA_CONSUMO C,
                    TBPRODUTO P
                WHERE
                    P.CODIGO = C.PRODUTO_ID
                AND C.REMESSA_ID = NEW.REMESSA
                AND C.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
                AND COALESCE(C.REMESSA_TALAO_DETALHE_ID,0) = 0
                AND C.STATUS = '0'
                AND C.COMPONENTE = '0'
            INTO
                CONSUMO_ID,
                CONSUMO_PRODUTO_ID,
                CONSUMO_TAMANHO,
                CONSUMO_FATOR_UNIDADE,
                CONSUMO_QUANTIDADE_SALDO,
                CONSUMO_UM,
                CONSUMO_FAMILIA_ID,
                CONSUMO_LOCALIZACAO_ID
            DO
            BEGIN
    
                /* VERIFICA SE O PRODUTO PERMITE BAIXA FRACIONADA */
                CONSUMO_PERMITE_FRACAO = COALESCE((
                    SELECT U.PODE_FRACIONAR
                      FROM TbUnidadeMedida_temp U
                     WHERE U.SIGLA = :CONSUMO_UM),'N');
    
                /* GERA O ID DA TRANSACAO DE SAIDA DO CONSUMO */
                CONSUMO_ESTOQUE_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
    
                /* REALIZA O CALCULO DE CONSUMO */
                /*
                   OBS1:
                       SE FOR O ULTIMO TALAO DETALHADO A SER PRODUZIDO A BAIXA DEVE SER IGUAL AO RESTANTE A SER CONSUMIDO,
                       SENAO, DEVERA SER CALCULDO BASEADO NA QUANTIDADE DO TALAO DETALHADO.
                   OBS2:
                       SE O PRODUTO NAO PERMITIR QUANTIDADE FRANCIONADA, O VALOR SERA ARREDONDADO PARA CIMA.
                */            
                CONSUMO_PRODUTO_TALAO = (
                    SELECT FIRST 1 Z.ID
                      FROM TBREMESSA_CONSUMO_TALAO Z
                     WHERE Z.TIPO = 1
                       AND Z.FAMILIA_ID = :REMESSA_FAMILIA_ID
                       AND (Z.INSUMO_PRODUTO_ID = :CONSUMO_PRODUTO_ID OR Z.INSUMO_FAMILIA_ID = :CONSUMO_FAMILIA_ID));
                CONSUMO_QUANTIDADE = IIF(ULTIMO_TALAO AND PRODUCAO_TOTAL,COALESCE(CONSUMO_QUANTIDADE_SALDO,0), COALESCE(IIF(CONSUMO_PRODUTO_TALAO > 0,NEW.QUANTIDADE_PEDIDO, NEW.QUANTIDADE_PRODUCAO) * CONSUMO_FATOR_UNIDADE,0));
                CONSUMO_QUANTIDADE = IIF(CONSUMO_PERMITE_FRACAO = 'S',CONSUMO_QUANTIDADE,FN_ARRENDONDAR_PARA_CIMA(CONSUMO_QUANTIDADE));
    
    
                IF ( CONSUMO_QUANTIDADE <= 0 ) THEN
                BEGIN
                    EXCEPTION "..." 'Quantidade consumida deverá ser maior que zero. Produto: ' || CONSUMO_PRODUTO_ID || ' Operação cancelada.';
                END
    
    
                /* VERIFICA SE O CONSUMO ESTÁ MAIOR QUE O PROJETADO. */
                /*
                    OBS: ESSE ERRO SO DEVE DISPARAR SE HOUVER PROBLEMA COM O FATOR UNIDADE OU SE O PRODUTO NAO PERMITIR FRACAO PARA CONSUMO
                 */
                IF ( CONSUMO_QUANTIDADE > CONSUMO_QUANTIDADE_SALDO ) THEN
                BEGIN
                    EXCEPTION "..." 'Quantidade consumida não deve ser maior que o saldo da projeção. Produto: ' || CONSUMO_PRODUTO_ID || ' QTD. CONS.:'||CONSUMO_QUANTIDADE||' QTD. SAL. CONS.:'||CONSUMO_QUANTIDADE_SALDO||' Operação cancelada.';
                END
    
                /* ATUALIZA A QUANTIDADE CONSUMIDA */
                UPDATE VWREMESSA_CONSUMO C
                   SET C.QUANTIDADE_CONSUMO = COALESCE(C.QUANTIDADE_CONSUMO,0) + :CONSUMO_QUANTIDADE,
                       C.ESTOQUE_ID = :CONSUMO_ESTOQUE_ID,
                       C.STATUS = IIF(:ULTIMO_TALAO,1,C.STATUS)
                 WHERE C.ID = :CONSUMO_ID;
    
    
    
    --            /* GUARDA A LOCALIZACAO DE PROCESSO (WIP) */
    --            CONSUMO_LOCALIZACAO_ID = COALESCE((
    --                SELECT FIRST 1 F.LOCALIZACAO_PROCESSO
    --                  FROM TBFAMILIA_FICHA F
    --                 WHERE F.FAMILIA_CODIGO         = :CONSUMO_FAMILIA_ID
    --                   AND F.ESTABELECIMENTO_CODIGO = NEW.ESTABELECIMENTO_CODIGO),0);
    --
    --            /* VERIFICA SE A LOCALIZACAO DE PROCESSO ESTA CONFIGURADA */
    --            IF ( CONSUMO_LOCALIZACAO_ID = 0 ) THEN
    --            BEGIN
    --                EXCEPTION "..." 'FAMILIA DO PRODUTO SEM LOCALIZACAO DE PROCESSO (WIP) DEFINIDA. ID PROD.' || CONSUMO_PRODUTO_ID || '. OPERACAO CANCELADA! ';
    --            END            
    
                /* REALIZA A TRANSACAO DE SAIDA DO CONSUMO */
                EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(
                    3,
                    :TALAO_GP_ID,
                    :UP_PERFIL,
                    :CONSUMO_FAMILIA_ID,  
                    :CONSUMO_LOCALIZACAO_ID,
                    'TBREMESSA_CONSUMO',
                    2,
                    :CONSUMO_ID,
                    NEW.ESTABELECIMENTO_CODIGO,
                    NEW.DATA_PRODUCAO,
                    :CONSUMO_PRODUTO_ID,
                    :CONSUMO_TAMANHO,
                    :CONSUMO_QUANTIDADE,
                    'S',
                    '1',
                    :UP_CCUSTO,
                    'WEB22180 - SAIDA POR CONSUMO DE REMESSA DE PRODUCAO. REMESSA: ' || REMESSA || ' TALAO: ' || FN_LPAD(NEW.REMESSA_ACUMULADO_CONTROLE,4,0),
                    :CONSUMO_ESTOQUE_ID,
                    NEW.REMESSA,
                    NEW.CONTROLE
                );
    
            END
    
    
            /* REALIZA AS BAIXAS DE CONSUMO GERAL AO TALAO */
            FOR
                SELECT
                    C.ID,
                    C.PRODUTO_ID,
                    C.TAMANHO,
                    C.FATOR_UNIDADE,
                    C.QUANTIDADE_SALDO,
                    P.UNIDADEMEDIDA_SIGLA,
                    P.FAMILIA_CODIGO,
                    P.LOCALIZACAO_CODIGO
                FROM
                    VWREMESSA_CONSUMO C,
                    TBPRODUTO P
                WHERE
                    P.CODIGO = C.PRODUTO_ID
                AND C.REMESSA_ID = NEW.REMESSA
                AND C.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
                AND C.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                AND C.STATUS = '0'
                AND C.COMPONENTE = '0'
            INTO
                CONSUMO_ID,
                CONSUMO_PRODUTO_ID,
                CONSUMO_TAMANHO,
                CONSUMO_FATOR_UNIDADE,
                CONSUMO_QUANTIDADE_SALDO,
                CONSUMO_UM,
                CONSUMO_FAMILIA_ID,
                CONSUMO_LOCALIZACAO_ID
            DO
            BEGIN
    
                /* VERIFICA SE O PRODUTO PERMITE BAIXA FRACIONADA */
                CONSUMO_PERMITE_FRACAO = COALESCE((
                    SELECT U.PODE_FRACIONAR
                      FROM TbUnidadeMedida_temp U
                     WHERE U.SIGLA = :CONSUMO_UM),'N');
    
                /* GERA O ID DA TRANSACAO DE SAIDA DO CONSUMO */
                CONSUMO_ESTOQUE_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
    
                /* REALIZA O CALCULO DE CONSUMO */
                /*
                   OBS1:
                       SE FOR O ULTIMO TALAO DETALHADO A SER PRODUZIDO A BAIXA DEVE SER IGUAL AO RESTANTE A SER CONSUMIDO,
                       SENAO, DEVERA SER CALCULDO BASEADO NA QUANTIDADE DO TALAO DETALHADO.
                   OBS2:
                       SE O PRODUTO NAO PERMITIR QUANTIDADE FRANCIONADA, O VALOR SERA ARREDONDADO PARA CIMA.
                */
                CONSUMO_PRODUTO_TALAO = (
                    SELECT FIRST 1 Z.ID
                      FROM TBREMESSA_CONSUMO_TALAO Z
                     WHERE Z.TIPO = 1
                       AND Z.FAMILIA_ID = :REMESSA_FAMILIA_ID
                       AND (Z.INSUMO_PRODUTO_ID = :CONSUMO_PRODUTO_ID OR Z.INSUMO_FAMILIA_ID = :CONSUMO_FAMILIA_ID));
                CONSUMO_QUANTIDADE = IIF(ULTIMO_TALAO AND PRODUCAO_TOTAL,COALESCE(CONSUMO_QUANTIDADE_SALDO,0), COALESCE(IIF(CONSUMO_PRODUTO_TALAO > 0,NEW.QUANTIDADE_PEDIDO, NEW.QUANTIDADE_PRODUCAO) * CONSUMO_FATOR_UNIDADE,0));
                CONSUMO_QUANTIDADE = IIF(CONSUMO_PERMITE_FRACAO = 'S',CONSUMO_QUANTIDADE,FN_ARRENDONDAR_PARA_CIMA(CONSUMO_QUANTIDADE));
    
    
                IF ( CONSUMO_QUANTIDADE <= 0 ) THEN
                BEGIN
                    EXCEPTION "..." 'Quantidade consumida deverá ser maior que zero. Produto: ' || CONSUMO_PRODUTO_ID || ' Operação cancelada.';
                END
    
    
                /* VERIFICA SE O CONSUMO ESTÁ MAIOR QUE O PROJETADO. */
                /*
                    OBS: ESSE ERRO SO DEVE DISPARAR SE HOUVER PROBLEMA COM O FATOR UNIDADE OU SE O PRODUTO NAO PERMITIR FRACAO PARA CONSUMO
                 */
                IF ( CONSUMO_QUANTIDADE > CONSUMO_QUANTIDADE_SALDO ) THEN
                BEGIN
                    EXCEPTION "..." 'Quantidade consumida não deve ser maior que o saldo da projeção. Produto: ' || CONSUMO_PRODUTO_ID || ' QTD. CONS.:'||CONSUMO_QUANTIDADE||' QTD. SAL. CONS.:'||CONSUMO_QUANTIDADE_SALDO||' Operação cancelada.';
                END
    
                /* ATUALIZA A QUANTIDADE CONSUMIDA */
                UPDATE VWREMESSA_CONSUMO C
                   SET C.QUANTIDADE_CONSUMO = COALESCE(C.QUANTIDADE_CONSUMO,0) + :CONSUMO_QUANTIDADE,
                       C.ESTOQUE_ID = :CONSUMO_ESTOQUE_ID,
                       C.STATUS = 1
                 WHERE C.ID = :CONSUMO_ID;
    
    
    
    --            /* GUARDA A LOCALIZACAO DE PROCESSO (WIP) */
    --            CONSUMO_LOCALIZACAO_ID = COALESCE((
    --                SELECT FIRST 1 F.LOCALIZACAO_PROCESSO
    --                  FROM TBFAMILIA_FICHA F
    --                 WHERE F.FAMILIA_CODIGO         = :CONSUMO_FAMILIA_ID
    --                   AND F.ESTABELECIMENTO_CODIGO = NEW.ESTABELECIMENTO_CODIGO),0);
    --
    --            /* VERIFICA SE A LOCALIZACAO DE PROCESSO ESTA CONFIGURADA */
    --            IF ( CONSUMO_LOCALIZACAO_ID = 0 ) THEN
    --            BEGIN
    --                EXCEPTION "..." 'FAMILIA DO PRODUTO SEM LOCALIZACAO DE PROCESSO (WIP) DEFINIDA. ID PROD.' || CONSUMO_PRODUTO_ID || '. OPERACAO CANCELADA! ';
    --            END            
    
                /* REALIZA A TRANSACAO DE SAIDA DO CONSUMO */
                EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(
                    3,
                    :TALAO_GP_ID,
                    :UP_PERFIL,
                    :CONSUMO_FAMILIA_ID,  
                    :CONSUMO_LOCALIZACAO_ID,
                    'TBREMESSA_CONSUMO',
                    2,
                    :CONSUMO_ID,
                    NEW.ESTABELECIMENTO_CODIGO,
                    NEW.DATA_PRODUCAO,
                    :CONSUMO_PRODUTO_ID,
                    :CONSUMO_TAMANHO,
                    :CONSUMO_QUANTIDADE,
                    'S',
                    '1',
                    :UP_CCUSTO,
                    'WEB22180 - SAIDA POR CONSUMO DE REMESSA DE PRODUCAO. REMESSA: ' || REMESSA || ' TALAO: ' || FN_LPAD(NEW.REMESSA_ACUMULADO_CONTROLE,4,0),
                    :CONSUMO_ESTOQUE_ID,
                    NEW.REMESSA,
                    NEW.CONTROLE
                );
    
            END
    
    
    
        END
        ELSE
        /* CANCELANDO PRODUCAO */
        IF ( OLD.SITUACAO = 2 AND NEW.SITUACAO = 1 ) THEN
        BEGIN

            FN_OPERADOR_AUTENTICACAO(NEW.OPERADOR_ID_PRODUCAO,31); /* CANCELAR PRODUCAO */


            SELECT FIRST 1
                   T.ID,
                   T.GP_ID,
                   T.UP_ID,
                   T.ESTACAO
              FROM VWREMESSA_TALAO T
             WHERE T.REMESSA_ID = NEW.REMESSA
               AND T.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
              INTO TALAO_ID,
                   TALAO_GP_ID,
                   TALAO_UP_ID,
                   TALAO_ESTACAO;

    
            SELECT ID,
                   STATUS
              FROM TBPROGRAMACAO P
             WHERE P.TABELA_ID = :TALAO_ID
               AND P.TIPO = 'A'
              INTO PROGRAMACAO_ID,
                   PROGRAMACAO_STATUS;


            IF ( PROGRAMACAO_STATUS <> 2 ) THEN
            BEGIN       
                UPDATE TBPROGRAMACAO P SET P.STATUS = 2 WHERE P.TIPO = 'A' AND P.TABELA_ID = :TALAO_ID;
    
                INSERT INTO TBPROGRAMACAO_REGISTRO (
                    PROGRAMACAO_ID,
                    STATUS,
                    OPERADOR_ID
                ) VALUES (
                   :PROGRAMACAO_ID,       
                   0,
                   NEW.OPERADOR_ID_PRODUCAO
                );
            END


            NEW.QUANTIDADE_PRODUCAO = 0;
            NEW.QUANTIDADE_SALDO = 0;
            NEW.HORA_PRODUCAO = NULL;
            NEW.DATA_PRODUCAO = NULL;


            FOR
                SELECT I.CONTROLE,
                       I.TABELA_ID,
                       I.QUANTIDADE
                  FROM TBESTOQUE_TRANSACAO_ITEM I
                 WHERE I.DOCUMENTO = NEW.REMESSA
                   AND I.REMESSA_ITEM_CONTROLE = NEW.CONTROLE
                   AND I.TABELA = 'TBREMESSA_CONSUMO'
                   AND I.TIPO = 'S'
                   AND I.TABELA_NIVEL = 2
            INTO
                CONSUMO_ESTOQUE_ID,
                CONSUMO_ID,
                CONSUMO_QUANTIDADE
            DO
            BEGIN
                UPDATE VWREMESSA_CONSUMO X
                   SET X.STATUS = '0',
                       X.ESTOQUE_ID = 0,
                       X.QUANTIDADE_CONSUMO = X.QUANTIDADE_CONSUMO - :CONSUMO_QUANTIDADE
                 WHERE X.ID = :CONSUMO_ID;

                 DELETE FROM TBESTOQUE_TRANSACAO_ITEM I WHERE I.CONTROLE = :CONSUMO_ESTOQUE_ID;

            END

        END
        ELSE
        IF ( OLD.SITUACAO = 3 AND NEW.SITUACAO = 1  ) THEN
        BEGIN
            EXCEPTION "..." 'TALAO JA COLETADO PARA A EXPEDICAO, OPERACAO NAO PERMITIDA.';
        END
        ELSE
        IF ( OLD.SITUACAO = 2 AND NEW.SITUACAO = 3 ) THEN
        BEGIN
            /* O TALAO ESTA SENDO COLETADO NA EXPEDICAO */
        END
        ELSE
        IF ( OLD.SITUACAO IS DISTINCT FROM NEW.SITUACAO  ) THEN
        BEGIN
            EXCEPTION "..." 'OPERACAO NAO DISPONIVEL PARA ESTE TALAO. ENTRE EM CONTATO COM SUPORTE TECNICO E INFORME A OPERACAO A SER REALIZADA.';
        END
    END

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbrequisicao_b0iu_01 for tbrequisicao
active before insert or update position 0
AS
DECLARE VARIABLE ESTABELECIMENTO INTEGER;
DECLARE VARIABLE USUARIO_ID INTEGER;
DECLARE VARIABLE USUARIO_NOME VARCHAR(20);
DECLARE VARIABLE UM    VARCHAR(3);
DECLARE VARIABLE DESCR VARCHAR(100);
DECLARE VARIABLE FRAC  CHAR(1);
DECLARE VARIABLE FAMILIA_ID  INTEGER;
DECLARE VARIABLE FAM_USUARIO INTEGER;
BEGIN

   USUARIO_NOME = (Select MON$USER from mon$attachments where mon$attachment_id = current_connection);

   if (:Usuario_Nome <> 'SYSDBA' and :Usuario_Nome <> 'GC') Then
       Begin

       USUARIO_ID = Coalesce((Select First 1 U.Codigo From TbUsuario U Where U.USUARIO = :USUARIO_NOME and U.Status = '1'),0);

          if (:USUARIO_ID = 0) then
              BEGIN
                  Exception "..." 'USUÁRIO INATIVO OU NÃO LOCALIZADO: '||:USUARIO_NOME||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END

        Estabelecimento = Coalesce((Select First 1 E.Estabelecimento_Codigo From TbUsuario_Estabelecimento E Where E.Usuario_Codigo = :USUARIO_ID),0);

        For Select First 1 U.SIGLA, P.DESCRICAO, U.PODE_FRACIONAR, P.FAMILIA_CODIGO,
        Coalesce((Select First 1 F.Familia_Id From TbUsuario_Familia F Where F.Familia_Id = P.Familia_Codigo and F.Usuario_Id = :USUARIO_ID),0),
        IIF(:ESTABELECIMENTO>0,Coalesce((Select First 1 E.Estabelecimento_Codigo From TbUsuario_Estabelecimento E Where E.Usuario_Codigo = :USUARIO_ID and E.Estabelecimento_Codigo = New.Estabelecimento_Id),0),-1)
        From TbProduto P, TbUnidadeMedida_temp U
        Where P.Codigo = New.PRODUTO_ID and P.Unidademedida_Sigla = U.Sigla
        Into :UM, :DESCR, :FRAC, :FAMILIA_ID, :FAM_USUARIO, :ESTABELECIMENTO
        Do
        Begin
          if (:ESTABELECIMENTO = 0) then
              BEGIN
                  Exception "..." 'USUÁRIO NÃO TEM PERMISSÃO DE REGISTRAR REQUISIÇÕES PARA O ESTABELECIMENTO INFORMADO: '||
                  :ESTABELECIMENTO||'-'||Coalesce((Select First 1 E.NomeFantasia From TbEstabelecimento E Where E.Codigo = New.Estabelecimento_Id),'')||' -> USUÁRIO: '||:USUARIO_ID||'-'||:Usuario_Nome||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
          if (:FAM_USUARIO = 0) then
              BEGIN
                  Exception "..." 'USUÁRIO NÃO TEM PERMISSÃO DE REGISTRAR REQUISIÇÕES PARA A FAMÍLIA DESTE PRODUTO: '||
                  :FAMILIA_ID||'-'||Coalesce((Select First 1 F.Descricao From TbFamilia F Where F.Codigo = :FAMILIA_ID),'')||' -> USUÁRIO: '||:USUARIO_ID||'-'||:Usuario_Nome||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
          if (:FRAC = 'N') then
              BEGIN
              if (NEW.QUANTIDADE > TRUNC(NEW.QUANTIDADE)) THEN
                  Exception "..." 'PRODUTO NÃO PERMITE QUANTIDADE FRACIONADA: '||
                  NEW.PRODUTO_ID||'-'||:DESCR||' QUANT.'||NEW.QUANTIDADE||' '||:UM||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
        --  NEW.USUARIO_ID = :USUARIO_ID;
        End
     End
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbrequisicao_oc_item_b3iu for tbrequisicao_oc_item
active before insert or update position 1
AS
declare variable UM varchar(10);
declare variable pode_fracionar char(1);
declare variable DESCRICAO VARCHAR(300);
begin
    if(new.PRODUTO_ID > 0) then
    begin
    FOR select first 1 coalesce(b.PODE_FRACIONAR,'N') AS PODE_FRACIONAR,
        coalesce(b.SIGLA,'') AS UM, A.DESCRICAO
        from tbproduto a, TBUNIDADEMEDIDA_TEMP b where a.codigo = new.produto_id
        and a.UNIDADEMEDIDA_SIGLA = b.SIGLA INTO PODE_FRACIONAR, UM, DESCRICAO DO
         BEGIN

           if(pode_fracionar = 'N') then
              BEGIN
              if (NEW.QUANTIDADE > TRUNC(NEW.QUANTIDADE)) THEN
                  Exception "..." 'PRODUTO NAO PERMITE QUANTIDADE FRACIONADA: '||
                  NEW.produto_id||'-'||DESCRICAO||' QUANT.'||NEW.QUANTIDADE||' '||UM||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
       END
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbsobra_b0iu_01 for tbsobra
active before insert or update position 0
AS
DECLARE VARIABLE ESTABELECIMENTO INTEGER;
DECLARE VARIABLE USUARIO_ID INTEGER;
DECLARE VARIABLE USUARIO_NOME VARCHAR(20);
DECLARE VARIABLE UM    VARCHAR(3);
DECLARE VARIABLE DESCR VARCHAR(100);
DECLARE VARIABLE FRAC  CHAR(1);
BEGIN

   USUARIO_NOME = (Select MON$USER from mon$attachments where mon$attachment_id = current_connection);

   if (:Usuario_Nome <> 'SYSDBA' and :Usuario_Nome <> 'GC') Then
       Begin

       USUARIO_ID = Coalesce((Select First 1 U.Codigo From TbUsuario U Where U.USUARIO = :USUARIO_NOME and U.Status = '1'),0);

          if (:USUARIO_ID = 0) then
              BEGIN
                  Exception "..." 'USUÁRIO INATIVO OU NÃO LOCALIZADO: '||:USUARIO_NOME||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END

        Estabelecimento = Coalesce((Select First 1 E.Estabelecimento_Codigo From TbUsuario_Estabelecimento E Where E.Usuario_Codigo = :USUARIO_ID),0);

        For Select First 1 U.SIGLA, P.DESCRICAO, U.PODE_FRACIONAR,
        IIF(:ESTABELECIMENTO>0,Coalesce((Select First 1 E.Estabelecimento_Codigo From TbUsuario_Estabelecimento E Where E.Usuario_Codigo = :USUARIO_ID and E.Estabelecimento_Codigo = New.Estabelecimento_Id),0),-1)
        From TbProduto P, TbUnidadeMedida_temp U
        Where P.Codigo = New.Produto_Id and P.Unidademedida_Sigla = U.Sigla
        Into :UM, :DESCR, :FRAC, :ESTABELECIMENTO
        Do
        Begin
          if (:ESTABELECIMENTO = 0) then
              BEGIN
                  Exception "..." 'USUÁRIO NÃO TEM PERMISSÃO DE REGISTRAR SOBRAS DO ESTABELECIMENTO INFORMADO: '||
                  :ESTABELECIMENTO||'-'||Coalesce((Select First 1 E.NomeFantasia From TbEstabelecimento E Where E.Codigo = New.Estabelecimento_Id),'')||' -> USUÁRIO: '||:USUARIO_ID||'-'||:Usuario_Nome||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
          if (:FRAC = 'N') then
              BEGIN
              if (NEW.QUANTIDADE > TRUNC(NEW.QUANTIDADE)) THEN
                  Exception "..." 'PRODUTO NÃO PERMITE QUANTIDADE FRACIONADA: '||
                  NEW.PRODUTO_ID||'-'||:DESCR||' QUANT.'||NEW.QUANTIDADE||' '||:UM||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
        End
     End
END
^

SET TERM ; ^

/******************************************************************************************************/

DROP TRIGGER TTBUNIDADEMEDIDA_B01I;
DROP TRIGGER TTBUNIDADEMEDIDA_B03I;
DROP TRIGGER TTBUNIDADEMEDIDA_B0I;

DROP TRIGGER TTBUNIDADEMEDIDA_B01U;
DROP TRIGGER TTBUNIDADEMEDIDA_B0U;

DROP TRIGGER TTBUNIDADEMEDIDA_B01D;
DROP TRIGGER TTBUNIDADEMEDIDA_B0D_01;

/******************************************************************************************************/

DROP TABLE TBUNIDADEMEDIDA;

/******************************************************************************************************/
/******************************************************************************************************/
/******************************************************************************************************/

/******************************************************************************/
/****                                Tables                                ****/
/******************************************************************************/


CREATE GENERATOR GTBUNIDADEMEDIDA;

CREATE TABLE TBUNIDADEMEDIDA (
    ID              INTEGER NOT NULL,
    SIGLA           VARCHAR(10),
    DESCRICAO       VARCHAR(50),
    STATUS          CHAR(1) DEFAULT '1',
    STATUSEXCLUSAO  CHAR(1) DEFAULT '0',
    USUARIO_CODIGO  INTEGER,
    DATA            DATE DEFAULT 'NOW',
    PODE_FRACIONAR  CHAR(1) DEFAULT '1',
    IMPORTADO       CHAR(1) DEFAULT '0',
    DESCRICAO_ALT   VARCHAR(10)
);




/******************************************************************************/
/****                             Primary keys                             ****/
/******************************************************************************/

ALTER TABLE TBUNIDADEMEDIDA ADD CONSTRAINT PK_TBUNIDADEMEDIDA PRIMARY KEY (ID);


/******************************************************************************/
/****                               Triggers                               ****/
/******************************************************************************/



SET TERM ^ ;



/******************************************************************************/
/****                         Triggers for tables                          ****/
/******************************************************************************/



/* Trigger: TTBUNIDADEMEDIDA_B01D */
CREATE OR ALTER TRIGGER TTBUNIDADEMEDIDA_B01D FOR TBUNIDADEMEDIDA
ACTIVE BEFORE DELETE POSITION 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF ( OLD.id > 0) THEN
    BEGIN
        HISTORICO = HISTORICO||'Registro Excluido';
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBUNIDADEMEDIDA',old.id, HISTORICO);
    END
end
^


/* Trigger: TTBUNIDADEMEDIDA_B01I */
CREATE OR ALTER TRIGGER TTBUNIDADEMEDIDA_B01I FOR TBUNIDADEMEDIDA
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF ( NEW.id > 0) THEN
    BEGIN
        HISTORICO = HISTORICO||' Registro Incluido';
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBUNIDADEMEDIDA',NEW.id, HISTORICO);
    END
end
^


/* Trigger: TTBUNIDADEMEDIDA_B01U */
CREATE OR ALTER TRIGGER TTBUNIDADEMEDIDA_B01U FOR TBUNIDADEMEDIDA
ACTIVE BEFORE UPDATE POSITION 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF ( OLD.descricao <> NEW.descricao) THEN
    BEGIN
        HISTORICO = HISTORICO||'Descricao:'|| OLD.descricao||'->'||NEW.descricao;
    END
    
    IF ( OLD.status <> NEW.status) THEN
    BEGIN
        HISTORICO = HISTORICO||', Status:'|| OLD.status||'->'||NEW.status;
    END
    
    IF ( OLD.SIGLA <> NEW.SIGLA) THEN
    BEGIN
        HISTORICO = HISTORICO||', Sigla:'|| OLD.SIGLA||'->'||NEW.SIGLA;
    END
    
    IF ( OLD.PODE_FRACIONAR <> NEW.PODE_FRACIONAR) THEN
    BEGIN
        HISTORICO = HISTORICO||', Fracionar:'|| OLD.PODE_FRACIONAR||'->'||NEW.PODE_FRACIONAR;
    END

    IF ( OLD.DESCRICAO_ALT <> NEW.DESCRICAO_ALT) THEN
    BEGIN
        HISTORICO = HISTORICO||', Desc.Alternativa:'|| OLD.DESCRICAO_ALT||'->'||NEW.DESCRICAO_ALT;
    END
    
    
    IF ( OLD.STATUSEXCLUSAO <> NEW.STATUSEXCLUSAO and new.STATUSEXCLUSAO = 0) THEN
    BEGIN
        HISTORICO = 'Registro Excluido';
    END
    
    IF ( OLD.STATUSEXCLUSAO <> NEW.STATUSEXCLUSAO and new.STATUSEXCLUSAO = 1) THEN
    BEGIN
        HISTORICO = 'Exclusão desfeita';
    END
    
    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBUNIDADEMEDIDA',NEW.id, HISTORICO);
    END
end
^


/* Trigger: TTBUNIDADEMEDIDA_B03I */
CREATE OR ALTER TRIGGER TTBUNIDADEMEDIDA_B03I FOR TBUNIDADEMEDIDA
ACTIVE BEFORE INSERT POSITION 0
AS
declare variable CODIGO VARCHAR(10);
begin
    IF(NEW.SIGLA IS NOT NULL) THEN
    BEGIN
        CODIGO = COALESCE((SELECT FIRST 1 A.SIGLA FROM TBUNIDADEMEDIDA A WHERE A.SIGLA = NEW.SIGLA),'');
    END
    
    IF(CODIGO <> '') THEN
    BEGIN
       EXCEPTION "..." 'SIGLA: '||CODIGO||' P/ UNIDADE DE MEDIDA JA CADASTRADA!';
    END
      /* Trigger text */
end
^


/* Trigger: TTBUNIDADEMEDIDA_B0D_01 */
CREATE OR ALTER TRIGGER TTBUNIDADEMEDIDA_B0D_01 FOR TBUNIDADEMEDIDA
ACTIVE BEFORE DELETE POSITION 0
AS
DECLARE VARIABLE p1 integer;
DECLARE VARIABLE p2 integer;
Begin

For Select
(Select First 1 A.Codigo From TbFamilia A Where A.UnidadeMedida_Sigla = OLD.SIGLA) ,
(Select First 1 A.Codigo From TbProduto A Where A.UnidadeMedida_Sigla = OLD.SIGLA)

FROM RDB$DATABASE
Into :p1 , :p2
Do
begin

  if (:P1 > 0) Then Exception "..." 'REGISTRO JÁ VINCULADO AO CADASTRO DE FAMÍLIAS. ID.'||:P1||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
  if (:P2 > 0) Then Exception "..." 'REGISTRO JÁ VINCULADO AO CADASTRO DE PRODUTOS. ID.'||:P2||' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';

end

End
^


/* Trigger: TTBUNIDADEMEDIDA_B0I */
CREATE OR ALTER TRIGGER TTBUNIDADEMEDIDA_B0I FOR TBUNIDADEMEDIDA
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.Id is null) then
      new.Id = gen_id(gTBUNIDADEMEDIDA,1);

  new.Importado = '0';
end
^


/* Trigger: TTBUNIDADEMEDIDA_B0U */
CREATE OR ALTER TRIGGER TTBUNIDADEMEDIDA_B0U FOR TBUNIDADEMEDIDA
ACTIVE BEFORE UPDATE POSITION 0
as
begin
  if (new.Importado = '1') then
      new.Descricao = Old.Descricao;

  new.Importado = '0';
end
^

SET TERM ; ^



/******************************************************************************/
/****                         Fields descriptions                          ****/
/******************************************************************************/

COMMENT ON COLUMN TBUNIDADEMEDIDA.DESCRICAO_ALT IS 
'Descição Alternativa para Uso na Unidade de Medida Alternativa';

/******************************************************************************/
/******************************************************************************/
/******************************************************************************/

INSERT INTO TBUNIDADEMEDIDA (SIGLA, DESCRICAO, STATUS, STATUSEXCLUSAO, USUARIO_CODIGO, DATA, ID, PODE_FRACIONAR, IMPORTADO, DESCRICAO_ALT)
    SELECT 
        SIGLA,
        DESCRICAO,
        STATUS,
        STATUSEXCLUSAO,
        USUARIO_CODIGO,
        DATA,
        ID,
        PODE_FRACIONAR,
        IMPORTADO,
        DESCRICAO_ALT
    FROM TBUNIDADEMEDIDA_TEMP;
	
/*******************************************************************************/
/*******************************************************************************/
/*******************************************************************************/

SET TERM ^ ;

CREATE OR ALTER procedure SPC_FORTES_NFE (
    ESTABELECIMENTO integer,
    DATA_INICIAL date,
    DATA_FINAL date)
returns (
    CONTEUDO varchar(1000))
as
declare variable CONT1 varchar(1000);
declare variable CONT2 varchar(1000);
declare variable CONTADOR integer;
declare variable NFE_ID integer;
begin

  CONTADOR = 1;
  Conteudo = 'CAB'||
             '|'||'71'|| /* VERSAO */
             '|GCWeb'||
             '|'||EXTRACT(YEAR FROM CURRENT_DATE)||LPAD(EXTRACT(MONTH FROM CURRENT_DATE),2,'0')||LPAD(EXTRACT(DAY FROM CURRENT_DATE),2,'0')||
             '|'||COALESCE((SELECT VALOR_EXT FROM TBCONTROLE_N WHERE ID = 133),'')||  /* GRUPO EMPRESARIAL */
             '|'||EXTRACT(YEAR FROM DATA_INICIAL)||LPAD(EXTRACT(MONTH FROM DATA_INICIAL),2,'0')||LPAD(EXTRACT(DAY FROM DATA_INICIAL),2,'0')||
             '|'||EXTRACT(YEAR FROM DATA_FINAL)||LPAD(EXTRACT(MONTH FROM DATA_FINAL),2,'0')||LPAD(EXTRACT(DAY FROM DATA_FINAL),2,'0')||
             '|ENTRADAS COM PRODUTOS'||
             '|N';
  SUSPEND;

/*
        SELECT
        'PAR'||
        '|'||Empresa_Codigo||
        '|'||RazaoSocial||
        '|'||UF||
        '|'||Cnpj||
        '|'||IE||
        '|'||coalesce(Im,'')||
        '|N||||N||N|N|' ||
        '|'||Endereco||
        '|'||Numero||
        '|'||coalesce(Complemento,'')||
        '|01|'||Bairro||
        '|'||Cep||
        '|'||FN_LPAD(Codigo_Ibge,5,'0')||
        '|||||||'||
        IIF(UF<>'EX','1058',FN_LPAD(Codigo_Pais,4,'0'))
        FROM (
                SELECT 
                DISTINCT 
                IIF((A.CNPJ = '00000000000000' or A.CNPJ = '') and (A.UF <> 'EX'), B.EMPRESA_CNPJ, B.EMPRESA_CODIGO) as EMPRESA_CODIGO,
                B.EMPRESA_CNPJ AS CNPJ, 
                A.IE, 
                B.SUFRAMA,
                A.COMPLEMENTO, 
                A.IM,
                (SELECT First 1 E.PAIS_CODIGO FROM TBCIDADE E WHERE MAX(B.EMPRESA_CIDADE) = E.DESCRICAO AND MAX(B.EMPRESA_UF) = E.UF) Codigo_Pais,
                (SELECT First 1 E.CODIGOIBGE  FROM TBCIDADE E WHERE MAX(B.EMPRESA_CIDADE) = E.DESCRICAO AND MAX(B.EMPRESA_UF) = E.UF) Codigo_Ibge,
                MAX(B.EMPRESA_UF) AS UF,
                MAX(B.EMPRESA_RAZAOSOCIAL) AS RAZAOSOCIAL,
                MAX(B.EMPRESA_BAIRRO) AS BAIRRO,
                MAX(B.EMPRESA_ENDERECO) AS ENDERECO,
                MAX(B.EMPRESA_NUMERO) AS NUMERO,
                MAX(B.EMPRESA_CEP) AS CEP
                
                FROM TbNfs B, TBEMPRESA A
                
                WHERE  B.EMPRESA_CODIGO = A.CODIGO
                  AND B.sped = '1'
                  AND B.NATUREZA = 1
                  AND B.situacao = 2
                  AND B.estabelecimento_codigo = :ESTABELECIMENTO
                  and(Extract(Year  from B.Data_Emissao) = :ANO)
                  and(Extract(Month from B.Data_Emissao) = :MES)
                
                Group By
                A.CNPJ,A.UF,B.EMPRESA_CNPJ,B.EMPRESA_CODIGO,
                B.EMPRESA_CNPJ,A.IE,B.SUFRAMA,A.COMPLEMENTO,A.IM
                
                Order By 1
             )

        SELECT
        'PRO'||
        '|'||FN_LPAD(CODIGO,8,'0')||
        '|'||FN_RPAD(DESCRICAO,60,' ')||
        '|'||FN_LPAD(CODIGO,8,'0')||
        '|'||NCM2||
        '|'||UNIDADEMEDIDA_SIGLA||
        '|'||IIF( UNID = '1' , 'LT'  ,
             IIF( UNID = '2' , 'MT'  ,
             IIF( UNID = '3' , 'M3'  ,
             IIF( UNID = '4' , 'M2'  ,
             IIF( UNID = '5' , 'PR'  ,
             IIF( UNID = '6' , 'KG'  ,
             IIF( UNID = '7' , 'KW'  ,
             IIF( UNID = '8' , 'UN'  , '')))))))) ||
        '|||001|00||' AS PRO,
        
        'OUM'||
        '|'||FN_LPAD(CODIGO,8,'0')||
        '|'||UNIDADEMEDIDA_SIGLA||
        '|1.000' AS OUM
        FROM (
                SELECT DISTINCT
                       C.CODIGO,
                       C.DESCRICAO,
                       C.UNIDADEMEDIDA_SIGLA,
                       C.NCM_CODIGO NCM2,
                      (SELECT FIRST 1 E.UNID_DIEF FROM TBFAMILIA_FICHA E
                        WHERE C.FAMILIA_CODIGO = E.FAMILIA_CODIGO
                          AND E.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_CODIGO) UNID
                FROM TBNFS_ITEM A, TBNFS B, TBPRODUTO C
                WHERE A.NFS_CONTROLE = B.CONTROLE
                  AND C.CODIGO = A.PRODUTO_CODIGO
                  AND B.SPED = '1'
                
                  AND ((B.NATUREZA = 1 AND B.SITUACAO = 2) OR
                       (B.NATUREZA = 2 AND B.SITUACAO = 1 AND B.EMPRESA_UF <> 'EX'))
                
                  AND B.ESPECIE IN('01','1B','04','55')
                  AND B.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO
                  AND   (EXTRACT(YEAR  FROM B.DATA_EMISSAO) = :ANO)
                  AND   (EXTRACT(MONTH FROM B.DATA_EMISSAO) = :MES)
        
                ORDER BY 1
             )
   */

     /* EMPRESAS */
        FOR
        SELECT
        'PAR'||
        '|'||EMPRESA_CODIGO||
        '|'||RAZAOSOCIAL||
        '|'||UF||
        '|'||CNPJ||
        '|'||IE||
        '|'||COALESCE(IM,'')||
        '|N'||
        '|N'||
        '|N'||
        '|N'||
        '|N'||
        '|N'||
        '|N'||
        '|N'||
        '|'|| -- tipo logradouro
        '|'||ENDERECO||
        '|'||NUMERO||
        '|'||COALESCE(COMPLEMENTO,'')||
        '|01'|| -- tipo de bairro
        '|'||BAIRRO||
        '|'||CEP||
        '|'||FN_LPAD(CODIGO_IBGE,5,'0')||
        '|'||  -- ddd
        '|'||  -- telefone
        '|N'|| -- suframa
        '|'||  -- subst. icms
        '|'||  -- conta remetente
        '|'||  -- conta prestador
        '|'||IIF(UF<>'EX','1058',FN_LPAD(CODIGO_PAIS,4,'0'))||
        '|'||IIF(UF<>'EX','N','S')||
        '|N'||
        '|'||EMAIL

        FROM (
                SELECT DISTINCT
                CAST(B.EMPRESA_CODIGO AS VARCHAR(14)) AS EMPRESA_CODIGO, 
                A.UF, A.CNPJ, A.IE, A.RAZAOSOCIAL, 
                A.COMPLEMENTO, A.BAIRRO, A.ENDERECO, A.NUMERO, A.CEP, A.IM,
                (SELECT E.PAIS_CODIGO FROM TBCIDADE E WHERE 
                  A.CIDADE = E.DESCRICAO AND A.UF = E.UF) CODIGO_PAIS,
                (SELECT E.CODIGOIBGE  FROM TBCIDADE E WHERE 
                  A.CIDADE = E.DESCRICAO AND A.UF = E.UF) CODIGO_IBGE,
                  A.EMAIL
                FROM TBNFE B, TBEMPRESA A
                WHERE B.EMPRESA_CODIGO = A.CODIGO
                  AND B.SPED = '1'
                  AND ((B.NATUREZA = 1 AND B.SITUACAO = 2) OR
                       (B.NATUREZA = 2 AND B.SITUACAO = 1))
                  AND B.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO
                  AND B.DATA_FISCAL BETWEEN :DATA_INICIAL AND :DATA_FINAL
                ORDER BY 1
        
             )
        INTO :CONT1
        DO BEGIN
           CONTADOR = CONTADOR + 1;
           CONTEUDO = CONT1;
           SUSPEND;
           END

     /* GRUPOS / FAMILIAS */
          FOR
            SELECT
            'GRP'||
            '|'||FN_LPAD(CODIGO,8,'0')||
            '|'||DESCRICAO||
            '|'||IIF( SIT_SPED = '00' , '1'  ,
                 IIF( SIT_SPED = '01' , '2'  ,
                 IIF( SIT_SPED = '02' , '5'  ,
                 IIF( SIT_SPED = '03' , '3'  ,
                 IIF( SIT_SPED = '04' , '4'  ,
                 IIF( SIT_SPED = '05' , '7'  ,
                 IIF( SIT_SPED = '06' , '7'  ,
                 IIF( SIT_SPED = '07' , '7'  ,
                 IIF( SIT_SPED = '08' , '7'  ,
                 IIF( SIT_SPED = '09' , '7'  ,
                 IIF( SIT_SPED = '10' , '7'  ,
                 IIF( SIT_SPED = '99' , '7'  , '')))))))))))) ||
            '|'||SIT_SPED||
            '|'
            FROM (
                    SELECT DISTINCT
                           F.CODIGO,
                           F.DESCRICAO,
                           COALESCE((SELECT FIRST 1 E.NG_SITUACAO FROM TBFAMILIA_FICHA E
                            WHERE C.FAMILIA_CODIGO = E.FAMILIA_CODIGO
                              AND E.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_CODIGO),'99') SIT_SPED
                    FROM TBNFE_ITEM A, TBNFE B, TBPRODUTO C, TBFAMILIA F
                    WHERE A.NFE_CONTROLE = B.CONTROLE
                      AND C.CODIGO = A.PRODUTO_CODIGO
                      AND B.SPED = '1'
                      AND ((B.NATUREZA = 1 AND B.SITUACAO = 2) OR
                           (B.NATUREZA = 2 AND B.SITUACAO = 1 AND B.EMPRESA_UF <> 'EX'))
                      AND B.ESPECIE IN('01','1B','04','55')
                      AND C.FAMILIA_INVENTARIO = F.CODIGO
                      AND B.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO
                      AND B.DATA_FISCAL BETWEEN :DATA_INICIAL AND :DATA_FINAL
                 )
        INTO :CONT1 
        DO BEGIN
           CONTADOR = CONTADOR + 1;
           CONTEUDO = CONT1;
           SUSPEND;
           END


     /* UNIDADES DE MEDIDA */
          FOR
            SELECT
            'UND'||
            '|'||UM||
            '|'||FN_RPAD(DESCRICAO,60,' ')
            FROM (
                    SELECT DISTINCT
                           C.UNIDADEMEDIDA_SIGLA AS UM,
                           U.DESCRICAO
                    FROM TBNFE_ITEM A, TBNFE B, TBPRODUTO C, TbUnidadeMedida U
                    WHERE A.NFE_CONTROLE = B.CONTROLE
                      AND C.CODIGO = A.PRODUTO_CODIGO
                      AND C.UNIDADEMEDIDA_SIGLA = U.SIGLA
                      AND B.SPED = '1'
                      AND ((B.NATUREZA = 1 AND B.SITUACAO = 2) OR
                           (B.NATUREZA = 2 AND B.SITUACAO = 1 AND B.EMPRESA_UF <> 'EX'))
                      AND B.ESPECIE IN('01','1B','04','55')
                      AND B.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO
                      AND B.DATA_FISCAL BETWEEN :DATA_INICIAL AND :DATA_FINAL
                 )
        INTO :CONT1
        DO BEGIN
           CONTADOR = CONTADOR + 1;
           CONTEUDO = CONT1;
           SUSPEND;
           END




     /* PRODUTO */
          FOR
            SELECT
            'PRO'||
            '|'||FN_LPAD(CODIGO,8,'0')||
            '|'||DESCRICAO||
            '|'||FN_LPAD(CODIGO,8,'0')||
            '|'||NCM||
            '|'||UM||
            '|'||UNID_DIEF||
            '|'||
            '|'||
            '|'||FN_LPAD(FAMILIA,8,'0')||
            '|'||
            '|'||
            '|'||
            '|'||
            '|'||CST_ORIGEM_PADRAO||CST_ICMS_PADRAO||
            '|'||'49'||
            '|'||CST_PISCOFINS_PADRAO||
            '|'||CST_PISCOFINS_PADRAO||
            '|'||
            '|'||
            '|'||
            '|'||
            '|'||
            '|'||'N'||
            '|'  AS PRO,

            'OUM'||
            '|'||FN_LPAD(CODIGO,8,'0')||
            '|'||UM||
            '|'||'1.000'||
            '|' -- COD BARRAS
                   AS OUM

            FROM (
                    SELECT DISTINCT
                           C.CODIGO,
                           C.DESCRICAO,
                           C.UNIDADEMEDIDA_SIGLA AS UM,
                           C.NCM_CODIGO AS NCM,
                           C.FAMILIA_INVENTARIO AS FAMILIA,

                          COALESCE((SELECT FIRST 1 E.UNID_DIEF FROM TBFAMILIA_FICHA E
                            WHERE C.FAMILIA_CODIGO = E.FAMILIA_CODIGO
                              AND E.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_CODIGO),'8') UNID_DIEF,
                          COALESCE((SELECT FIRST 1 E.CST_ORIGEM FROM TBFAMILIA_FICHA E
                            WHERE C.FAMILIA_CODIGO = E.FAMILIA_CODIGO
                              AND E.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_CODIGO),'0') CST_ORIGEM_PADRAO,
                          COALESCE((SELECT FIRST 1 E.CST FROM TBFAMILIA_FICHA E
                            WHERE C.FAMILIA_CODIGO = E.FAMILIA_CODIGO
                              AND E.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_CODIGO),'90') CST_ICMS_PADRAO,
                          COALESCE((SELECT FIRST 1 E.CST_PISCOF FROM TBFAMILIA_FICHA E
                            WHERE C.FAMILIA_CODIGO = E.FAMILIA_CODIGO
                              AND E.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_CODIGO),'98') CST_PISCOFINS_PADRAO

                    FROM TBNFE_ITEM A, TBNFE B, TBPRODUTO C
                    WHERE A.NFE_CONTROLE = B.CONTROLE
                      AND C.CODIGO = A.PRODUTO_CODIGO
                      AND B.SPED = '1'
                      AND ((B.NATUREZA = 1 AND B.SITUACAO = 2) OR
                           (B.NATUREZA = 2 AND B.SITUACAO = 1 AND B.EMPRESA_UF <> 'EX'))
                      AND B.ESPECIE IN('01','1B','04','55')
                      AND B.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO
                      AND B.DATA_FISCAL BETWEEN :DATA_INICIAL AND :DATA_FINAL
                    ORDER BY 1
                 )
        INTO :CONT1, :CONT2
        DO BEGIN
           CONTADOR = CONTADOR + 1;
           CONTEUDO = CONT1;
           SUSPEND;

           CONTADOR = CONTADOR + 1;
           CONTEUDO = CONT2;
           SUSPEND;
           END


        /* NOTAS DE ENTRADA */
            FOR
                SELECT
                'NFM'||
                '|'||LPAD(ESTABELECIMENTO_ID,4,'0')||
                '|'||'E'||
                '|'||DESCRICAO_ESPECIE||
                '|'||IIF(NATUREZA=1,'S','N')||
                '|'|| --AIDF
                '|'||SERIE||
                '|'||
                '|'||LPAD(NUMERO_NOTAFISCAL,9,'0')||
                '|'||
                '|'||
                '|'||EXTRACT(YEAR FROM DATA_EMISSAO)||LPAD(EXTRACT(MONTH FROM DATA_EMISSAO),2,'0')||LPAD(EXTRACT(DAY FROM DATA_EMISSAO),2,'0')||
                '|'||-- situação do documento, informado só pra saída   IIF(SITUACAO=3,'1','0')||
                '|'||EXTRACT(YEAR FROM DATA_FISCAL)||LPAD(EXTRACT(MONTH FROM DATA_FISCAL),2,'0')||LPAD(EXTRACT(DAY FROM DATA_FISCAL),2,'0')||
                '|'||EMPRESA_ID||
                '|'||'N'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||

                '|'||CAST(VALOR_PRODUTOS AS NUMERIC(15,2))||
                '|'||CAST(VALOR_FRETE AS NUMERIC(15,2))||
                '|'||CAST(VALOR_SEGURO AS NUMERIC(15,2))||
                '|'||CAST(VALOR_OUTROSCUSTOS AS NUMERIC(15,2))||
                '|'||0.00|| /* icms importação */
                '|'||0.00|| /* icms diferido */
                '|'||CAST(VALOR_IPI AS NUMERIC(15,2))||
                '|'||0.00||/* icms subst retido */
                '|'||CAST(VALOR_ISSQN AS NUMERIC(15,2))||
                '|'||CAST(VALOR_DESCONTO AS NUMERIC(15,2))||
                '|'||CAST(VALOR_TOTAL_NF AS NUMERIC(15,2))||
                '|'||LPAD(ITENS,10,'0')||
                '|'||'N'||
                '|'||'N'||
                '|'||'N'||
                '|'||
                '|'||
                '|'||
                '|'||'N'||
                '|'||
                '|'||
                '|'||

                '|'||'N'||--FRETE||
                '|'||'N'||--PAGAMENTO||
                '|'||
                '|'||

                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||CAST(RETENCAO_VALOR_COFINS AS NUMERIC(15,2))||
                '|'||CAST(RETENCAO_VALOR_PIS AS NUMERIC(15,2))||
                '|'||CAST(RETENCAO_VALOR_CSLL AS NUMERIC(15,2))||
                '|'||
                '|'||'N'||
                '|'||
                '|'||
                '|'||CHAVE_ACESSO||
                '|'||
                '|'||

                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'

                ,NFE_ID
                
                FROM (
                        SELECT B.CONTROLE NFE_ID,
                               B.ESTABELECIMENTO_CODIGO AS ESTABELECIMENTO_ID,
                               B.EMPRESA_CODIGO AS EMPRESA_ID,
                               B.ESPECIE,
                               B.MODELO,
                               B.SERIE,
                               B.NUMERO_NOTAFISCAL,
                               B.CHAVE_ACESSO,
                               B.DATA_EMISSAO,
                               B.DATA_FISCAL,
                               B.NATUREZA,
                               B.SITUACAO,
                               MAX((SELECT MAX(E.XML) FROM TBNF_LOTE E WHERE B.CONTROLE = E.NFE_CONTROLE AND E.NFS_CONTROLE = 0 AND B.ESTABELECIMENTO_CODIGO = E.ESTABELECIMENTO_CODIGO)) XML,
                              (SELECT FIRST 1 D.FRETE FROM TBNFE_TRANSPORTADORA D WHERE  D.NFE_CONTROLE = B.CONTROLE) AS FRETE,
                              (SELECT FIRST 1 G.DESCRICAO_RESUMIDA FROM TBFISCAL_ESPECIE G WHERE B.MODELO = G.CODIGO_DIEF AND B.ESPECIE = G.CODIGO_SPED) DESCRICAO_ESPECIE,
                               COALESCE(IIF((SELECT CAST(COUNT(P.PARCELA) AS INTEGER) FROM TBNFE_PARCELAMENTO P WHERE B.CONTROLE = P.NFE_CONTROLE) > 0, '1' /*PRAZO*/, '2'/*OUTROS*/),'2') AS PAGAMENTO,
                        
                               COUNT(A.CONTROLE) AS ITENS,
                               SUM(A.VALOR_DESCONTO) AS VALOR_DESCONTO,
                               SUM(A.VALOR_PEDAGIO) AS VALOR_PEDAGIO,
                               SUM(A.VALOR_FRETE) AS VALOR_FRETE,
                               SUM(A.VALOR_SEGURO) AS VALOR_SEGURO,
                               SUM(A.FISCAL_BASECALCULO_ICMS_ST) basecalculo_icms_subst,
                               SUM(A.FISCAL_VALOR_ICMS_ST) valor_icms_subst,
                               SUM(A.VALOR_TOTAL) VALOR_PRODUTOS,
                               SUM(A.VALOR_CONTABIL) VALOR_CONTABIL,
                               SUM(A.VALOR_BASECALCULO_ICMS) BASECALCULO_ICMS,
                               SUM(A.FISCAL_VALOR_ICMS) VALOR_ICMS,
                               SUM(A.FISCAL_VALOR_IPI) VALOR_IPI,
                               SUM(A.FISCAL_VALOR_PIS) VALOR_PIS,
                               SUM(A.FISCAL_VALOR_COFINS) VALOR_COFINS,
                               SUM(A.FISCAL_BASECALCULO_IPI) AS BASECALCULO_IPI,
                               SUM(A.VALOR_ACRESCIMO) AS VALOR_ACRESCIMO,
                        
                               C.VALOR_OUTROSCUSTOS,
                               C.VALOR_TOTAL_NF,
                               C.VALOR_ISSQN,
                               C.RETENCAO_VALOR_ISSQN,
                               C.RETENCAO_VALOR_COFINS,
                               C.RETENCAO_VALOR_PIS,
                               C.RETENCAO_VALOR_CSLL,
                               C.RETENCAO_VALOR_IRRF,
                               C.RETENCAO_VALOR_INSS
                        
                        FROM TBNFE_ITEM A, TBNFE B, TBNFE_TOTAIS C
                        WHERE  A.NFE_CONTROLE = B.CONTROLE
                          AND  C.NFE_CONTROLE = B.CONTROLE
                          AND  B.SPED = '1'
                          AND ((B.NATUREZA = 1 AND B.SITUACAO > 1) OR (B.NATUREZA = 2 AND B.SITUACAO = 1))
                          AND  B.ESPECIE IN('01','1B','55')
                          AND  B.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO
                          AND  B.DATA_FISCAL BETWEEN :DATA_INICIAL AND :DATA_FINAL

                        GROUP BY
                        B.CONTROLE, B.ESTABELECIMENTO_CODIGO, B.EMPRESA_CODIGO, B.ESPECIE,
                        B.SERIE, B.NUMERO_NOTAFISCAL, B.CHAVE_ACESSO, B.DATA_EMISSAO,
                        B.DATA_FISCAL, B.NATUREZA, B.SITUACAO, C.VALOR_OUTROSCUSTOS,
                        C.VALOR_TOTAL_NF, C.VALOR_ISSQN, B.MODELO, C.RETENCAO_VALOR_ISSQN,
                        C.RETENCAO_VALOR_COFINS, C.RETENCAO_VALOR_PIS, C.RETENCAO_VALOR_CSLL,
                        C.RETENCAO_VALOR_IRRF, C.RETENCAO_VALOR_INSS
                )
        INTO :CONT1, :NFE_ID
        DO BEGIN
           CONTADOR = CONTADOR + 1;
           CONTEUDO = CONT1;
           SUSPEND;







       /* ITENS DAS NOTAS FISCAIS DE ENTRADA */
             FOR
                SELECT
                'PNM'||
                '|'||LPAD(PRODUTO_CODIGO,8,'0')||
                '|'||REPLACE(FISCAL_CFOP_CODIGO,'.','')||
                '|'||
                '|'||FISCAL_TRIBUTACAO_ORIGEM||
                '|'||LPAD(FISCAL_TRIBUTACAO_ICMS,2,'0')||
                '|'||PRODUTO_UNIDADEMEDIDA||
                '|'||CAST(QUANTIDADE AS NUMERIC(15,2))||
                '|'||CAST(VALOR_TOTAL AS NUMERIC(15,2))||
                '|'||CAST(FISCAL_VALOR_IPI AS NUMERIC(15,2))||
                '|'||IIF(FISCAL_TRIBUTACAO_ICMS =  0, '1',
                     IIF(FISCAL_TRIBUTACAO_ICMS = 20, '1',
                     IIF(FISCAL_TRIBUTACAO_ICMS = 30, '2',
                     IIF(FISCAL_TRIBUTACAO_ICMS = 40, '2',
                     IIF(FISCAL_TRIBUTACAO_ICMS = 41, '2','3')))))||
                '|'||CAST(BASECALCULO_ICMS_R AS NUMERIC(15,2))||
                '|'||CAST(FISCAL_PERCENTUAL_ICMS AS NUMERIC(15,2))||
                '|'||
                '|'||
                '|'||'0'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||

                '|'||IIF(FISCAL_TRIBUTACAO_IPI ='00','1',
                     IIF(FISCAL_TRIBUTACAO_IPI ='01','1',
                     IIF(FISCAL_TRIBUTACAO_IPI ='02','2',
                     IIF(FISCAL_TRIBUTACAO_IPI ='03','2',
                     IIF(FISCAL_TRIBUTACAO_IPI ='04','3',
                     IIF(FISCAL_TRIBUTACAO_IPI ='05','3',
                     IIF(FISCAL_TRIBUTACAO_IPI ='49','3','3')))))))||
                '|'||CAST(FISCAL_BASECALCULO_IPI AS NUMERIC(15,2))||
                '|'||CAST(FISCAL_PERCENTUAL_IPI AS NUMERIC(15,2))||
                '|'||CAST(FISCAL_VALOR_IPI AS NUMERIC(15,2))||
                '|'||FISCAL_TRIBUTACAO_IPI||

                '|'|| -- FISCAL_TRIBUTACAO_COFINS||
                '|'|| -- FISCAL_TRIBUTACAO_PIS||

                '|'||CAST(FISCAL_BASECALCULO_COFINS AS NUMERIC(15,2))||
                '|'||CAST(FISCAL_BASECALCULO_PIS AS NUMERIC(15,2))||

                '|'||CAST(VALOR_FRETE AS NUMERIC(15,2))||
                '|'||CAST(VALOR_SEGURO AS NUMERIC(15,2))||
                '|'||CAST(VALOR_DESCONTO AS NUMERIC(15,2))||
                '|'||CAST(VALOR_TOTAL+VALOR_FRETE+VALOR_SEGURO-VALOR_DESCONTO AS NUMERIC(15,2))||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||'1'||
                '|'||
                '|'||
                '|'||
                '|'||'1'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||'0'
                FROM (
                        SELECT B.SEQUENCIA,
                               B.PRODUTO_CODIGO,
                               B.FISCAL_CFOP_CODIGO,
                               B.FISCAL_TRIBUTACAO_ORIGEM, 
                               B.PRODUTO_UNIDADEMEDIDA,
                               B.QUANTIDADE,
                               B.VALOR_TOTAL, 
                               B.FISCAL_TRIBUTACAO_ICMS,
                               B.VALOR_BASECALCULO_ICMS AS BASECALCULO_ICMS_R,
                               B.FISCAL_PERCENTUAL_ICMS,
                               B.FISCAL_TRIBUTACAO_IPI,
                               B.FISCAL_BASECALCULO_IPI,
                               B.FISCAL_PERCENTUAL_IPI,
                               B.FISCAL_VALOR_IPI, 
                               B.FISCAL_TRIBUTACAO_COFINS,
                               B.FISCAL_BASECALCULO_COFINS,
                               B.FISCAL_TRIBUTACAO_PIS,
                               B.FISCAL_BASECALCULO_PIS,
                               B.VALOR_FRETE,
                               B.VALOR_SEGURO,
                               B.VALOR_DESCONTO,
                               B.VALOR_CONTABIL 
                        
                        FROM TBNFE_ITEM B
                        WHERE B.NFE_CONTROLE = :NFE_ID
                        ORDER BY 1
                 )
                INTO :CONT1
                DO BEGIN
                   CONTADOR = CONTADOR + 1;
                   CONTEUDO = CONT1;
                   SUSPEND;
                   END


                 /* TOTALIZADORES DA NF POR CFOP */
                  FOR
                    SELECT
                    'INM'||
                    '|'||CAST(VALOR AS NUMERIC(15,2))||
                    '|'||EMPRESA_UF||
                    '|'||REPLACE(FISCAL_CFOP_CODIGO,'.','')||
                    '|'||
                    '|'||CAST(BASECALCULO_ICMS_R AS NUMERIC(15,2))||
                    '|'||CAST(FISCAL_PERCENTUAL_ICMS AS NUMERIC(15,2))||
                    '|'||CAST(VALOR_ICMS AS NUMERIC(15,2))||
                    '|'||CAST(iICMS AS NUMERIC(15,2))||
                    '|'||CAST(oICMS AS NUMERIC(15,2))||
                    
                    '|'||CAST(BcIPI AS NUMERIC(15,2))||
                    '|'||CAST(VALOR_IPI AS NUMERIC(15,2))||
                    '|'||CAST(IIPI AS NUMERIC(15,2))||
                    '|'||CAST(oIPI AS NUMERIC(15,2))||
                    '|'||
                    '|'||
                    '|'||
                    '|'
                    
                    FROM (
                            SELECT 
                            A.FISCAL_CFOP_CODIGO,
                            E.EMPRESA_UF,
                            A.FISCAL_Percentual_Icms,
                            A.FISCAL_Percentual_Ipi,
                            A.FISCAL_Tributacao_Icms,
                            A.FISCAL_Tributacao_Ipi,
                            SUM(A.VALOR_TOTAL) VALOR,
                            SUM(A.FISCAL_VALOR_IPI) VALOR_IPI,
                            SUM(A.FISCAL_VALOR_ICMS) VALOR_ICMS,
                            SUM(A.FISCAL_BASECALCULO_ICMS) BCICMS,
                            SUM(A.FISCAL_BASECALCULO_IPI) BcIPI, 
                            SUM(A.FISCAL_ISENTAS_ICMS) IICMS,
                            SUM(A.FISCAL_ISENTAS_IPI) IIPI, 
                            SUM(A.FISCAL_OUTRAS_ICMS) OICMS,
                            SUM(A.FISCAL_OUTRAS_IPI) OIPI,
                            SUM(A.VALOR_BASECALCULO_ICMS) BASECALCULO_ICMS_R
                            
                            FROM TBNFE_ITEM A, TBNFE E
                            WHERE A.NFE_CONTROLE = E.CONTROLE
                              AND A.NFE_CONTROLE = :NFE_ID
                            
                            Group By 
                            A.FISCAL_CFOP_CODIGO,
                            E.EMPRESA_UF,
                            A.FISCAL_PERCENTUAL_ICMS,
                            A.FISCAL_PERCENTUAL_IPI, 
                            A.FISCAL_TRIBUTACAO_ICMS,
                            A.FISCAL_TRIBUTACAO_IPI
                    )
                INTO :CONT1
                DO BEGIN
                   CONTADOR = CONTADOR + 1;
                   CONTEUDO = CONT1;
                   SUSPEND;
                   END

       END


           /* FRETES */
             FOR
                SELECT
                'CTC'||
                '|'||LPAD(ESTABELECIMENTO_ID,4,'0')||
                '|'||'E'||
                '|'||DESCRICAO_ESPECIE||
                '|'||  
                '|'||SERIE||
                '|'||
                '|'||LPAD(NUMERO_NOTAFISCAL,9,'0')||
                '|'||
                '|'||EXTRACT(YEAR FROM DATA_EMISSAO)||LPAD(EXTRACT(MONTH FROM DATA_EMISSAO),2,'0')||LPAD(EXTRACT(DAY FROM DATA_EMISSAO),2,'0')||

                '|'||'0'|| -- Situação do Documento
                '|'||EXTRACT(YEAR FROM DATA_FISCAL)||LPAD(EXTRACT(MONTH FROM DATA_FISCAL),2,'0')||LPAD(EXTRACT(DAY FROM DATA_FISCAL),2,'0')||
                '|'||IIF(FRETE = 0, 'C',
                     IIF(FRETE = 1, 'F',
                     IIF(FRETE = 2, 'S',
                     IIF(FRETE = 3, 'S',
                     IIF(FRETE = 4, 'S',
                     IIF(FRETE = 9, 'S','S'))))))||
                '|'||EMPRESA_ID||
                '|'||
                '|'||REPLACE(FISCAL_CFOP_CODIGO,'.','')||
                '|'||CAST(VALOR_TOTAL_NF AS NUMERIC(15,2))||
                '|'||CAST(VALOR_BASECALCULO_ICMS AS NUMERIC(15,2))||
                '|'||CAST(FISCAL_PERCENTUAL_ICMS AS NUMERIC(15,2))||
                '|'||CAST(VALOR_ICMS AS NUMERIC(15,2))||

                '|'||CAST(VALOR_ISENTAS_ICMS AS NUMERIC(15,2))||
                '|'||CAST(VALOR_OUTRAS_ICMS  AS NUMERIC(15,2))||
                '|'||(SELECT UF FROM TBUF WHERE CODIGO_IBGE = SUBSTRING(CMUNINI FROM 1 FOR 2))||
                '|'||SUBSTRING(CMUNINI FROM 3 FOR 5)||
                '|'||(SELECT UF FROM TBUF WHERE CODIGO_IBGE = SUBSTRING(CMUNFIM FROM 1 FOR 2))||
                '|'||SUBSTRING(CMUNFIM FROM 3 FOR 5)||
                '|'||   -- DISTANCIA
                '|'||   -- QUANT. MERCADORIAS
                '|'||   -- UNID MEDIDA
                '|'||   -- FRETE CALCULADO

                '|'||   -- PLACA DO VEICULO
                '|'||   -- UF VEICULO
                '|'||   -- AIDF DO RMD
                '|'||   -- SERIE DO RMD
                '|'||   -- SUBSERIE DO RMD
                '|'||   -- NUMERO DO RMD
                '|'||'N'|| -- DIF ALIQUOTA (S/N)
                '|'||   -- BS CALC DIF ALIQUOTA
                '|'||   -- ALIQ ORIGEM
                '|'||   -- ALIQ INTERNA

                '|'||   -- RECEITA TRIBUTAVEL COFINS
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'||

                '|'||  -- CSL RETIDO NA FONTE
                '|'||
                '|'||
                '|'||'N'||
                '|'||FN_LPAD(FISCAL_TRIBUTACAO_ICMS,2,'0')|| -- CSTb ICMS
                '|'||IIF(DESCRICAO_ESPECIE='CTE',CHAVE_ACESSO,'')||
                '|'|| -- COD INF COMPLEMENTAR
                '|'||FISCAL_TRIBUTACAO_PIS||
                '|'||FISCAL_TRIBUTACAO_COFINS||
                '|'||

                '|'||IND_NAT_FRETE||
                '|'||
                '|'||
                '|'||
                '|'||
                '|'

                FROM (
                        SELECT B.CONTROLE NFE_ID,
                               B.ESTABELECIMENTO_CODIGO AS ESTABELECIMENTO_ID,
                               B.EMPRESA_CODIGO AS EMPRESA_ID,
                               B.ESPECIE,
                               B.MODELO,
                               B.SERIE,
                               B.NUMERO_NOTAFISCAL,
                               B.CHAVE_ACESSO,
                               B.DATA_EMISSAO,
                               B.DATA_FISCAL,
                               B.NATUREZA,
                               B.SITUACAO,
                               D.FRETE,
                               D.CMUNINI,
                               D.CMUNFIM,
                               D.IND_NAT_FRETE,
                              (SELECT FIRST 1 G.DESCRICAO_RESUMIDA FROM TBFISCAL_ESPECIE G WHERE B.MODELO = G.CODIGO_DIEF AND B.ESPECIE = G.CODIGO_SPED) DESCRICAO_ESPECIE,
                
                               A.FISCAL_CFOP_CODIGO,
                               A.FISCAL_PERCENTUAL_ICMS,
                               SUM(A.VALOR_DESCONTO) AS VALOR_DESCONTO,
                               SUM(A.VALOR_PEDAGIO) AS VALOR_PEDAGIO,
                               SUM(A.VALOR_FRETE) AS VALOR_FRETE,
                               SUM(A.VALOR_SEGURO) AS VALOR_SEGURO,
                               SUM(A.VALOR_TOTAL) VALOR_PRODUTOS,
                               SUM(A.VALOR_CONTABIL) VALOR_CONTABIL,
                               SUM(A.VALOR_BASECALCULO_ICMS) VALOR_BASECALCULO_ICMS,
                               SUM(A.FISCAL_VALOR_ICMS) VALOR_ICMS,
                               SUM(A.FISCAL_ISENTAS_ICMS) VALOR_ISENTAS_ICMS,
                               SUM(A.FISCAL_OUTRAS_ICMS) VALOR_OUTRAS_ICMS,
                               SUM(A.FISCAL_VALOR_IPI) VALOR_IPI,
                               SUM(A.FISCAL_VALOR_PIS) VALOR_PIS,
                               SUM(A.FISCAL_VALOR_COFINS) VALOR_COFINS,
                               SUM(A.VALOR_ACRESCIMO) AS VALOR_ACRESCIMO,
                               C.VALOR_TOTAL_NF,
                               A.FISCAL_TRIBUTACAO_ICMS,
                               A.FISCAL_TRIBUTACAO_PIS,
                               A.FISCAL_TRIBUTACAO_COFINS
                
                        FROM TBNFE_ITEM A, TBNFE B, TBNFE_TOTAIS C, TBNFE_TRANSPORTADORA D 
                        WHERE  A.NFE_CONTROLE = B.CONTROLE
                          AND  C.NFE_CONTROLE = B.CONTROLE
                          AND  D.NFE_CONTROLE = B.CONTROLE
                          AND  B.SPED = '1'
                          AND  B.ESPECIE IN('07','08','8B','09','10','11','26','27','57')
                          AND  B.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO
                          AND B.DATA_FISCAL BETWEEN :DATA_INICIAL AND :DATA_FINAL

                        GROUP BY
                        B.CONTROLE, B.ESTABELECIMENTO_CODIGO, B.EMPRESA_CODIGO, B.ESPECIE,
                        B.SERIE, B.NUMERO_NOTAFISCAL, B.CHAVE_ACESSO, B.DATA_EMISSAO,
                        B.DATA_FISCAL, B.NATUREZA, B.SITUACAO, C.VALOR_OUTROSCUSTOS,
                        C.VALOR_TOTAL_NF, B.MODELO, A.FISCAL_CFOP_CODIGO, A.FISCAL_PERCENTUAL_ICMS,
                        D.FRETE, D.CMUNINI, D.CMUNFIM, D.IND_NAT_FRETE, A.FISCAL_TRIBUTACAO_PIS,
                        A.FISCAL_TRIBUTACAO_COFINS,A.FISCAL_TRIBUTACAO_ICMS
                )
                INTO :CONT1
                DO BEGIN
                   CONTADOR = CONTADOR + 1;
                   CONTEUDO = CONT1;
                   SUSPEND;
                   END

    CONTEUDO = 'TRA'||
               '|'||FN_LPAD(CONTADOR+1,10,'0');
    SUSPEND;

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPC_MODELOS_REMSSA (
    REMESSAS blob sub_type 1 segment size 80 = '',
    DATA1 date = null,
    DATA2 date = null,
    FAMILIAS blob sub_type 1 segment size 80 = '',
    STATUS_TALAO integer = 0,
    ESTABELECIMENTO integer = 0)
returns (
    MODELO_ID integer,
    MODELO_DESCRICAO varchar(200),
    COR_ID integer,
    COR_DESCRICAO varchar(80),
    TAM_DESCRICAO varchar(40),
    GRADE_CODIGO integer,
    TAMANHO integer,
    QUANTIDADE numeric(18,4),
    SALDO_FATURAR numeric(18,4),
    ALOC_EST numeric(18,4),
    ALOC_REM numeric(18,4),
    ALOC_AGR numeric(18,4),
    PEDIDO integer,
    CLIENTE_CODIGO integer,
    CLIENTE varchar(80),
    DATA date,
    PREV_FATURAMENTO date,
    DATA_CLIENTE date,
    PRODUTO_ID integer,
    FAMILIA_ID integer,
    UM varchar(12),
    FRACIONAR char(4),
    INFO blob sub_type 1 segment size 100)
as
declare variable OREMESSA integer;
declare variable TIPO_REMESSA integer;
begin

  for
    select
        osplit
    from split(:REMESSAS,',')
  into OREMESSA
  do begin

      TIPO_REMESSA = coalesce((select first 1 0 from tbremessa_acumulado a where a.remessa = :OREMESSA),1);

      if(TIPO_REMESSA = 1)then
      begin
        for
            SELECT
                A.MODELO_CODIGO MODELO_ID,
                M.DESCRICAO MODELO_DESCRICAO,
                A.COR_ID,
                (SELECT FIRST 1 C.DESCRICAO FROM TBCOR C WHERE C.CODIGO = A.COR_ID) COR_DESCRICAO,
                (SELECT TAM_DESCRICAO FROM SP_TAMANHO_GRADE (M.GRADE_CODIGO,A.TAMANHO)) TAM_DESCRICAO,
                M.GRADE_CODIGO,
                A.TAMANHO,
                CAST(A.QUANTIDADE_PEDIDO AS NUMERIC(15,4)) QUANTIDADE,
                CAST(0.0000 AS NUMERIC(15,4)) SALDO_FATURAR,
                CAST(0.0000 AS NUMERIC(15,4)) ALOC_EST,
                CAST(0.0000 AS NUMERIC(15,4)) ALOC_REM,
                CAST(0.0000 AS NUMERIC(15,4)) ALOC_AGR,
                0 PEDIDO, 0 CLIENTE_CODIGO,
                CAST('' AS VARCHAR(20)) CLIENTE,
                CAST(NULL AS DATE) DATA,
                CAST(NULL AS DATE) PREV_FATURAMENTO,
                CAST(NULL AS DATE) DATA_CLIENTE,
                P.CODIGO AS PRODUTO_ID,
                P.FAMILIA_CODIGO AS FAMILIA_ID,
                U.SIGLA AS UM,
                U.PODE_FRACIONAR AS FRACIONAR,
        
                FN_TO_JSON_V2(
                    FN_TO_PAR_JSON_V2('REMESSA', R.REMESSA),
                    FN_TO_PAR_JSON_V2('NUMERO', R.NUMERO),
                    FN_TO_PAR_JSON_V2('TALAO', fn_lpad(A.REMESSA_ACUMULADO_CONTROLE,4,'0')),
                    FN_TO_PAR_JSON_V2('CONTROLE', A.CONTROLE),
                    FN_TO_PAR_JSON_V2('QUANTIDADE', A.QUANTIDADE_PEDIDO),
                    FN_TO_PAR_JSON_V2('ORIGEM', coalesce(R.ORIGEM,'0'))
                ) AS INFO
        
            FROM TBPEDIDO_ITEM_PROCESSADO A, TBREMESSA R, TBMODELO M, TBPRODUTO P, TbUnidadeMedida U
            WHERE A.ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO
            AND A.MODELO_CODIGO = M.CODIGO
            AND A.ESTABELECIMENTO_CODIGO = R.ESTABELECIMENTO_CODIGO
            AND A.REMESSA = R.NUMERO
            
            AND P.MODELO_CODIGO = M.CODIGO
            AND P.COR_CODIGO    = A.COR_ID
            AND P.CODIGO        = A.PRODUTO_CODIGO
            AND U.SIGLA         = P.UNIDADEMEDIDA_SIGLA
            and R.NUMERO        = :OREMESSA

            and iif(:STATUS_TALAO > 0 , iif(:STATUS_TALAO = 2, A.SITUACAO < 3 and A.DATA_PRODUCAO is NULL, A.SITUACAO = 3 and A.DATA_PRODUCAO is NULL), true)
            and iif(:DATA1 is distinct from null and :DATA2 is distinct from null, R.DATA BETWEEN :DATA1 AND :DATA2, true)
            and iif(char_length(:FAMILIAS) > 1, M.FAMILIA_CODIGO in (select osplit from split(:FAMILIAS,',')),true)

         into
            MODELO_ID,
            MODELO_DESCRICAO,
            COR_ID,
            COR_DESCRICAO,
            TAM_DESCRICAO,
            GRADE_CODIGO,
            TAMANHO,
            QUANTIDADE,
            SALDO_FATURAR,
            ALOC_EST,
            ALOC_REM,
            ALOC_AGR,
            PEDIDO,
            CLIENTE_CODIGO,
            CLIENTE,
            DATA,
            PREV_FATURAMENTO,
            DATA_CLIENTE,
            PRODUTO_ID,
            FAMILIA_ID,
            UM,
            FRACIONAR,
            INFO
        do begin
            suspend;
        end
    
      end else
      begin
        for
            SELECT 
            
                A.MODELO_CODIGO MODELO_ID, M.DESCRICAO MODELO_DESCRICAO, A.cor_codigo as COR_ID,
                (SELECT FIRST 1 C.DESCRICAO FROM TBCOR C WHERE C.CODIGO = A.cor_codigo) COR_DESCRICAO,
                (SELECT TAM_DESCRICAO FROM SP_TAMANHO_GRADE (M.GRADE_CODIGO,A.TAMANHO)) TAM_DESCRICAO,
                M.GRADE_CODIGO, A.TAMANHO, CAST(A.quantidade AS NUMERIC(15,4)) QUANTIDADE,
                CAST(0.0000 AS NUMERIC(15,4)) SALDO_FATURAR,
                CAST(0.0000 AS NUMERIC(15,4)) ALOC_EST,
                CAST(0.0000 AS NUMERIC(15,4)) ALOC_REM,
                CAST(0.0000 AS NUMERIC(15,4)) ALOC_AGR,
                0 PEDIDO, 0 CLIENTE_CODIGO,
                CAST('' AS VARCHAR(20)) CLIENTE,
                CAST(NULL AS DATE) DATA,
                CAST(NULL AS DATE) PREV_FATURAMENTO,
                CAST(NULL AS DATE) DATA_CLIENTE,
                P.CODIGO AS PRODUTO_ID,
                P.FAMILIA_CODIGO AS FAMILIA_ID,
                U.SIGLA AS UM,
                U.PODE_FRACIONAR AS FRACIONAR,
            
                FN_TO_JSON_V2(
                    FN_TO_PAR_JSON_V2('REMESSA', R.REMESSA),
                    FN_TO_PAR_JSON_V2('NUMERO', R.NUMERO),
                    FN_TO_PAR_JSON_V2('TALAO', fn_lpad(0,4,'0')),
                    FN_TO_PAR_JSON_V2('CONTROLE', A.CONTROLE),
                    FN_TO_PAR_JSON_V2('QUANTIDADE', A.quantidade),
                    FN_TO_PAR_JSON_V2('ORIGEM', coalesce(R.ORIGEM,'0'))
                ) INFO

            FROM TBREMESSA_ACUMULADO A, TBREMESSA R, TBMODELO M, TBPRODUTO P, TbUnidadeMedida U
            WHERE A.MODELO_CODIGO = M.CODIGO
            AND A.ESTABELECIMENTO_CODIGO = R.ESTABELECIMENTO_CODIGO
            AND A.REMESSA = R.NUMERO
            
            AND P.MODELO_CODIGO     = M.CODIGO
            AND P.COR_CODIGO        = A.cor_codigo
            AND P.CODIGO            = A.PRODUTO_CODIGO
            AND U.SIGLA             = P.UNIDADEMEDIDA_SIGLA
            AND R.NUMERO            = :OREMESSA

            and iif(:DATA1 is distinct from null and :DATA2 is distinct from null, R.DATA BETWEEN :DATA1 AND :DATA2, true)
            and iif(char_length(:FAMILIAS) > 1, M.FAMILIA_CODIGO in (select osplit from split(:FAMILIAS,',')),true)

         into
            MODELO_ID,
            MODELO_DESCRICAO,
            COR_ID,
            COR_DESCRICAO,
            TAM_DESCRICAO,
            GRADE_CODIGO,
            TAMANHO,
            QUANTIDADE,
            SALDO_FATURAR,
            ALOC_EST,
            ALOC_REM,
            ALOC_AGR,
            PEDIDO,
            CLIENTE_CODIGO,
            CLIENTE,
            DATA,
            PREV_FATURAMENTO,
            DATA_CLIENTE,
            PRODUTO_ID,
            FAMILIA_ID,
            UM,
            FRACIONAR,
            INFO
        do begin
            suspend;
        end
      end
  end

end
^

SET TERM ; ^

CREATE OR ALTER VIEW VWPDV_PRODUTOS(
    ESTABELECIMENTO_ID,
    LOCALIZACAO_ID,
    FAMILIA_ID,
    MODELO_ID,
    PRODUTO_ID,
    PRODUTO_DESCRICAO,
    COR_DESCRICAO,
    UM,
    NCM,
    EAN,
    TAMANHO,
    FRACIONAR,
    CEST,
    CFOP_CODIGO,
    OPERACAO_CODIGO,
    TABELA_PRECO_ID,
    VALOR_UNITARIO,
    VALOR_UNITARIO_PROMOCIONAL,
    QUANTIDADE_MINIMA,
    TRIBUTACAO_ORIGEM,
    TRIBUTACAO_ICMS,
    ICMS_ALIQUOTA,
    TRIBUTACAO_PIS,
    PIS_ALIQUOTA,
    TRIBUTACAO_COFINS,
    COFINS_ALIQUOTA,
    REDUCAO_BASE_PISCOF,
    TIPO_DESCONTO,
    TAM_DESCRICAO)
AS
SELECT
ESTABELECIMENTO_ID,
LOCALIZACAO_ID,
FAMILIA_ID,
MODELO_ID,
PRODUTO_ID,
PRODUTO_DESCRICAO||' '||TAM_DESCRICAO AS PRODUTO_DESCRICAO,
COR_DESCRICAO,
UM,
NCM,
EAN,
TAMANHO,
FRACIONAR,
CEST,
CFOP_CODIGO,
OPERACAO_CODIGO,
TABELA_PRECO_ID,
VALOR_UNITARIO,
CAST(FN_ARRAY(VALOR_QUANTIDADE_PROMOCIONAL,1,'|') AS NUMERIC(15,2)) VALOR_UNITARIO_PROMOCIONAL,
CAST(FN_ARRAY(VALOR_QUANTIDADE_PROMOCIONAL,2,'|') AS INTEGER) QUANTIDADE_MINIMA,
TRIBUTACAO_ORIGEM,
TRIBUTACAO_ICMS,
ICMS_ALIQUOTA,
TRIBUTACAO_PIS,
PIS_ALIQUOTA,
TRIBUTACAO_COFINS,
COFINS_ALIQUOTA,
REDUCAO_BASE_PISCOF,
TIPO_DESCONTO,
TAM_DESCRICAO

FROM (
            SELECT 
                B.ESTABELECIMENTO_CODIGO ESTABELECIMENTO_ID,
                B.LOCALIZACAO_PDV AS LOCALIZACAO_ID,
                P.FAMILIA_INVENTARIO AS FAMILIA_ID,
                M.CODIGO AS MODELO_ID,
                P.CODIGO AS PRODUTO_ID,
                IIF(COALESCE(N.DESCRICAO_PDV,'') <> '' AND N.DESCRICAO_PDV <> '0', COALESCE(N.DESCRICAO_PDV,''),
                   IIF(COALESCE(M.DESCRICAO_COMERCIAL,'') <> '' AND M.DESCRICAO_COMERCIAL <> '0',
                       COALESCE(UPPER(M.DESCRICAO_COMERCIAL),'')||' '||COALESCE(UPPER(H.DESCRICAO),''),
                          COALESCE(UPPER(P.DESCRICAO),'')/*||' '||COALESCE(UPPER(H.DESCRICAO),'')*/)) PRODUTO_DESCRICAO,
                H.DESCRICAO AS COR_DESCRICAO,
                P.UNIDADEMEDIDA_SIGLA AS UM,
                P.NCM_CODIGO AS NCM,
                E.PREFIXO||E.CODIGO||COALESCE((SELECT DIGITO FROM DIGITOEAN(E.PREFIXO||E.CODIGO)),'') AS EAN,
                E.TAMANHO,

               (SELECT U.PODE_FRACIONAR FROM TbUnidadeMedida U WHERE U.SIGLA = P.UNIDADEMEDIDA_SIGLA) FRACIONAR,
               (SELECT CEST FROM TBFAMILIA F WHERE F.CODIGO = P.FAMILIA_INVENTARIO) CEST,
                B.CFOP_CODIGO,
                B.OPERACAO_PDV AS OPERACAO_CODIGO,
                MP.TABELA_ID   AS TABELA_PRECO_ID,
                IIF(E.TAMANHO = 1 AND MP.PR_NF_01 > 0, MP.PR_NF_01,
                IIF(E.TAMANHO = 2 AND MP.PR_NF_02 > 0, MP.PR_NF_02,
                IIF(E.TAMANHO = 3 AND MP.PR_NF_03 > 0, MP.PR_NF_03,
                IIF(E.TAMANHO = 4 AND MP.PR_NF_04 > 0, MP.PR_NF_04,
                IIF(E.TAMANHO = 5 AND MP.PR_NF_05 > 0, MP.PR_NF_05,
                IIF(E.TAMANHO = 6 AND MP.PR_NF_06 > 0, MP.PR_NF_06,
                IIF(E.TAMANHO = 7 AND MP.PR_NF_07 > 0, MP.PR_NF_07,
                IIF(E.TAMANHO = 8 AND MP.PR_NF_08 > 0, MP.PR_NF_08,
                IIF(E.TAMANHO = 9 AND MP.PR_NF_09 > 0, MP.PR_NF_09,
                IIF(E.TAMANHO =10 AND MP.PR_NF_10 > 0, MP.PR_NF_10,
                IIF(E.TAMANHO =11 AND MP.PR_NF_11 > 0, MP.PR_NF_11,
                IIF(E.TAMANHO =12 AND MP.PR_NF_12 > 0, MP.PR_NF_12,
                IIF(E.TAMANHO =13 AND MP.PR_NF_13 > 0, MP.PR_NF_13,
                IIF(E.TAMANHO =14 AND MP.PR_NF_14 > 0, MP.PR_NF_14,
                IIF(E.TAMANHO =15 AND MP.PR_NF_15 > 0, MP.PR_NF_15,
                IIF(E.TAMANHO =16 AND MP.PR_NF_16 > 0, MP.PR_NF_16,
                IIF(E.TAMANHO =17 AND MP.PR_NF_17 > 0, MP.PR_NF_17,
                IIF(E.TAMANHO =18 AND MP.PR_NF_18 > 0, MP.PR_NF_18,
                IIF(E.TAMANHO =19 AND MP.PR_NF_19 > 0, MP.PR_NF_19,
                IIF(E.TAMANHO =20 AND MP.PR_NF_20 > 0, MP.PR_NF_20,
                MP.PRECO_VENDA)))))))))))))))))))) AS VALOR_UNITARIO,

                IIF(TP.TABELA_PRECO_ID_PROMOCIONAL > 0,
                COALESCE((SELECT

                    IIF(E.TAMANHO = 1 AND MPP.PR_NF_01 > 0, MPP.PR_NF_01,
                    IIF(E.TAMANHO = 2 AND MPP.PR_NF_02 > 0, MPP.PR_NF_02,
                    IIF(E.TAMANHO = 3 AND MPP.PR_NF_03 > 0, MPP.PR_NF_03,
                    IIF(E.TAMANHO = 4 AND MPP.PR_NF_04 > 0, MPP.PR_NF_04,
                    IIF(E.TAMANHO = 5 AND MPP.PR_NF_05 > 0, MPP.PR_NF_05,
                    IIF(E.TAMANHO = 6 AND MPP.PR_NF_06 > 0, MPP.PR_NF_06,
                    IIF(E.TAMANHO = 7 AND MPP.PR_NF_07 > 0, MPP.PR_NF_07,
                    IIF(E.TAMANHO = 8 AND MPP.PR_NF_08 > 0, MPP.PR_NF_08,
                    IIF(E.TAMANHO = 9 AND MPP.PR_NF_09 > 0, MPP.PR_NF_09,
                    IIF(E.TAMANHO =10 AND MPP.PR_NF_10 > 0, MPP.PR_NF_10,
                    IIF(E.TAMANHO =11 AND MPP.PR_NF_11 > 0, MPP.PR_NF_11,
                    IIF(E.TAMANHO =12 AND MPP.PR_NF_12 > 0, MPP.PR_NF_12,
                    IIF(E.TAMANHO =13 AND MPP.PR_NF_13 > 0, MPP.PR_NF_13,
                    IIF(E.TAMANHO =14 AND MPP.PR_NF_14 > 0, MPP.PR_NF_14,
                    IIF(E.TAMANHO =15 AND MPP.PR_NF_15 > 0, MPP.PR_NF_15,
                    IIF(E.TAMANHO =16 AND MPP.PR_NF_16 > 0, MPP.PR_NF_16,
                    IIF(E.TAMANHO =17 AND MPP.PR_NF_17 > 0, MPP.PR_NF_17,
                    IIF(E.TAMANHO =18 AND MPP.PR_NF_18 > 0, MPP.PR_NF_18,
                    IIF(E.TAMANHO =19 AND MPP.PR_NF_19 > 0, MPP.PR_NF_19,
                    IIF(E.TAMANHO =20 AND MPP.PR_NF_20 > 0, MPP.PR_NF_20,
                    MPP.PRECO_VENDA))))))))))))))))))))||'|'||COALESCE(MPP.QUANTIDADE_MINIMA,0)

                    FROM TBMODELO_PRECO MPP, TBTABELA_PRECO TPP
                    WHERE MPP.TABELA_ID = TPP.ID
                    AND MPP.MODELO_CODIGO = M.CODIGO
                    AND MPP.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_CODIGO
                    AND TPP.HABILITA_PDV = '1'
                    AND CURRENT_DATE BETWEEN TPP.DATA_INICIAL AND TPP.DATA_FINAL
                    AND TPP.ID = TP.TABELA_PRECO_ID_PROMOCIONAL), '0|0'), '0|0') AS VALOR_QUANTIDADE_PROMOCIONAL,

                B.CST_ORIGEM   AS TRIBUTACAO_ORIGEM,
                B.CST          AS TRIBUTACAO_ICMS,
                B.TAXA_ICMS    AS ICMS_ALIQUOTA,
                COALESCE(B.CST_PISCOF,'')  AS TRIBUTACAO_PIS,
                B.TAXA_PIS     AS PIS_ALIQUOTA,
                COALESCE(B.CST_PISCOF,'')  AS TRIBUTACAO_COFINS,
                B.TAXA_COFINS  AS COFINS_ALIQUOTA,
                C.REDUCAO_BASE_PISCOF,
                OP.TIPO_DESCONTO,
                FN_TAMANHO_GRADE(P.GRADE_CODIGO, E.TAMANHO) AS TAM_DESCRICAO

            FROM TBMODELO        M,
                 TBCOR           H,
                 TBFAMILIA_FICHA B,
                 TBMODELO_PRECO MP,
                 TBTABELA_PRECO TP,
                 TBCFOP          C,
                 TBOPERACAO     OP,
                 TBEAN           E,
                 TBPRODUTO       P
                 LEFT JOIN TBPRODUTO_FICHA N ON N.PRODUTO_CODIGO = P.CODIGO 

            WHERE MP.ESTABELECIMENTO_CODIGO = B.ESTABELECIMENTO_CODIGO
              AND B.FAMILIA_CODIGO          = P.FAMILIA_INVENTARIO
              AND E.MODELO_ID               = P.MODELO_CODIGO
              AND M.CODIGO                  = P.MODELO_CODIGO
              AND M.CODIGO                  = MP.MODELO_CODIGO
              AND E.COR_ID                  = P.COR_CODIGO
              AND H.CODIGO                  = P.COR_CODIGO
              AND C.CODIGO                  = B.CFOP_CODIGO
              AND OP.CODIGO                 = B.OPERACAO_PDV
              AND MP.TABELA_ID              = TP.ID
              AND P.STATUS                  = '1'  /* SOMENTE PRODUTOS ATIVOS */
              AND M.STATUS                  = '1'  /* SOMENTE MODELOS  ATIVOS */
              AND TP.HABILITA_PDV           = '1'  /* SOMENTE ITENS COM TABELA DE PREÇO HABILITADAS PARA PDV */
              AND CURRENT_DATE BETWEEN TP.DATA_INICIAL AND TP.DATA_FINAL /* SOMENTE TABELAS DE PREÇOS VIGENTES NA DATA CORRENTE */
)
;

SET TERM ^ ;

CREATE OR ALTER procedure SPC_REMESSA_CONSUMO_TALAO (
    REMESSA_ID integer,
    REMESSA_TALAO_ID integer,
    QUANTIDADE_PRODUCAO numeric(10,5))
returns (
    CONSUMO_ID integer,
    CONSUMO_PRODUTO_ID integer,
    CONSUMO_TAMANHO integer,
    CONSUMO_FATOR_UNIDADE numeric(15,8),
    CONSUMO_QUANTIDADE_SALDO numeric(15,5),
    CONSUMO_UM varchar(10),
    CONSUMO_FAMILIA_ID integer,
    CONSUMO_LOCALIZACAO_ID integer,
    CONSUMO_PERMITE_FRACAO varchar(5),
    CONSUMO_QUANTIDADE numeric(15,5),
    ULTIMO_TALAO boolean)
as
begin

        ULTIMO_TALAO = IIF(COALESCE((
            SELECT COUNT(D.ID)
              FROM VWREMESSA_TALAO_DETALHE D
             WHERE D.REMESSA_ID = :REMESSA_ID
               AND D.REMESSA_TALAO_ID = :REMESSA_TALAO_ID
               AND D.STATUS < 2
        ),0) = 1,TRUE, FALSE);


        /* REALIZA AS BAIXAS DE CONSUMO */
        FOR
            SELECT
                C.ID,
                C.PRODUTO_ID,
                C.TAMANHO,
                C.FATOR_UNIDADE,
                C.QUANTIDADE_SALDO,
                P.UNIDADEMEDIDA_SIGLA,
                P.FAMILIA_CODIGO,
                P.LOCALIZACAO_CODIGO
            FROM
                VWREMESSA_CONSUMO C,
                TBPRODUTO P
            WHERE
                P.CODIGO = C.PRODUTO_ID
            AND C.REMESSA_ID = :REMESSA_ID
            AND C.REMESSA_TALAO_ID = :REMESSA_TALAO_ID
            AND C.STATUS = '0'
            AND C.COMPONENTE = '0'
        INTO
            CONSUMO_ID,
            CONSUMO_PRODUTO_ID,
            CONSUMO_TAMANHO,
            CONSUMO_FATOR_UNIDADE,
            CONSUMO_QUANTIDADE_SALDO,
            CONSUMO_UM,
            CONSUMO_FAMILIA_ID,
            CONSUMO_LOCALIZACAO_ID
        DO
        BEGIN

            /* VERIFICA SE O PRODUTO PERMITE BAIXA FRACIONADA */
            CONSUMO_PERMITE_FRACAO = COALESCE((
                SELECT U.PODE_FRACIONAR
                  FROM TbUnidadeMedida U
                 WHERE U.SIGLA = :CONSUMO_UM),'N');

            /* REALIZA O CALCULO DE CONSUMO */
            /*
               OBS1:
                   SE FOR O ULTIMO TALAO DETALHADO A SER PRODUZIDO A BAIXA DEVE SER IGUAL AO RESTANTE A SER CONSUMIDO,
                   SENAO, DEVERA SER CALCULDO BASEADO NA QUANTIDADE DO TALAO DETALHADO.
               OBS2:
                   SE O PRODUTO NAO PERMITIR QUANTIDADE FRANCIONADA, O VALOR SERA ARREDONDADO PARA CIMA.
            */
            CONSUMO_QUANTIDADE = IIF(ULTIMO_TALAO,COALESCE(CONSUMO_QUANTIDADE_SALDO,0), COALESCE(:QUANTIDADE_PRODUCAO * CONSUMO_FATOR_UNIDADE,0));
            CONSUMO_QUANTIDADE = IIF(CONSUMO_PERMITE_FRACAO = 'S',CONSUMO_QUANTIDADE,FN_ARRENDONDAR_PARA_CIMA(CONSUMO_QUANTIDADE));


            SUSPEND;
        END

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbdefeito_trans_item_b0iu_01 for tbdefeito_transacao_item
active before insert or update position 0
AS
DECLARE VARIABLE ESTABELECIMENTO INTEGER;
DECLARE VARIABLE USUARIO_ID INTEGER;
DECLARE VARIABLE USUARIO_NOME VARCHAR(20);
DECLARE VARIABLE UM    VARCHAR(3);
DECLARE VARIABLE DESCR VARCHAR(100);
DECLARE VARIABLE FRAC  CHAR(1);
BEGIN

   USUARIO_NOME = (Select MON$USER from mon$attachments where mon$attachment_id = current_connection);

   if (:Usuario_Nome <> 'SYSDBA' and :Usuario_Nome <> 'GC') Then
       Begin

       USUARIO_ID = Coalesce((Select First 1 U.Codigo From TbUsuario U Where U.USUARIO = :USUARIO_NOME and U.Status = '1'),0);

       if (NEW.QUANTIDADE > 10000) then
           BEGIN
             Exception "..." 'QUANTIDADE INVALIDA: '||NEW.QUANTIDADE||
             ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
           END

          if (:USUARIO_ID = 0) then
              BEGIN
                  Exception "..." 'USUÁRIO INATIVO OU NÃO LOCALIZADO: '||:USUARIO_NOME||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END

        Estabelecimento = Coalesce((Select First 1 E.Estabelecimento_Codigo From TbUsuario_Estabelecimento E Where E.Usuario_Codigo = :USUARIO_ID),0);

        For Select First 1 U.SIGLA, P.DESCRICAO, U.PODE_FRACIONAR,
        IIF(:ESTABELECIMENTO>0,Coalesce((Select First 1 E.Estabelecimento_Codigo From TbUsuario_Estabelecimento E Where E.Usuario_Codigo = :USUARIO_ID and E.Estabelecimento_Codigo = New.Estabelecimento_Id),0),-1)
        From TbProduto P, TbUnidadeMedida U
        Where P.Codigo = New.Produto_Id and P.Unidademedida_Sigla = U.Sigla
        Into :UM, :DESCR, :FRAC, :ESTABELECIMENTO
        Do
        Begin
          if (:ESTABELECIMENTO = 0) then
              BEGIN
                  Exception "..." 'USUARIO NAO TEM PERMISSAO DE REGISTRAR DEFEITOS DO ESTABELECIMENTO INFORMADO: '||
                  :ESTABELECIMENTO||'-'||Coalesce((Select First 1 E.NomeFantasia From TbEstabelecimento E Where E.Codigo = New.Estabelecimento_Id),'')||' -> USUÁRIO: '||:USUARIO_ID||'-'||:Usuario_Nome||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
--        if (:FAM_USUARIO = 0) then
--            BEGIN
--                Exception "..." 'USUÁRIO NÃO TEM PERMISSÃO DE REGISTRAR DEFEITOS DA FAMÍLIA DESTE PRODUTO: '||
--                :FAMILIA_ID||'-'||Coalesce((Select First 1 F.Descricao From TbFamilia F Where F.Codigo = :FAMILIA_ID),'')||' -> USUÁRIO: '||:USUARIO_ID||'-'||:Usuario_Nome||
--                ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
--            END
          if (:FRAC = 'N') then
              BEGIN
              if (NEW.QUANTIDADE > TRUNC(NEW.QUANTIDADE)) THEN
                  Exception "..." 'PRODUTO NAO PERMITE QUANTIDADE FRACIONADA: '||
                  NEW.PRODUTO_ID||'-'||:DESCR||' QUANT.'||NEW.QUANTIDADE||' '||:UM||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
          NEW.USUARIO_ID = :USUARIO_ID;
        End
     End
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbestoque_trans_item_b0iu_01 for tbestoque_transacao_item
active before insert position 0
AS
DECLARE VARIABLE ESTABELECIMENTO INTEGER;
DECLARE VARIABLE USUARIO_ID INTEGER;
DECLARE VARIABLE USUARIO_NOME VARCHAR(20);
DECLARE VARIABLE UM    VARCHAR(3);
DECLARE VARIABLE DESCR VARCHAR(200);
DECLARE VARIABLE FRAC  CHAR(1);
DECLARE VARIABLE PROD_STATUS CHAR(1);
DECLARE VARIABLE FAMILIA_ID  INTEGER;
DECLARE VARIABLE FAM_USUARIO INTEGER;
DECLARE VARIABLE FAM_OPERACAO VARCHAR(200);
DECLARE VARIABLE Loc VARCHAR(600);
declare variable Operacao_id INTEGER;
declare variable GRADE_ID INTEGER;
declare variable CCUSTO varchar(10);
BEGIN

   if (NEW.QUANTIDADE < 0 or
       NEW.T01 < 0 or NEW.T02 < 0 or NEW.T03 < 0 or NEW.T04 < 0 or NEW.T05 < 0 or
       NEW.T06 < 0 or NEW.T07 < 0 or NEW.T08 < 0 or NEW.T09 < 0 or NEW.T10 < 0 or
       NEW.T11 < 0 or NEW.T12 < 0 or NEW.T13 < 0 or NEW.T14 < 0 or NEW.T15 < 0 or
       NEW.T16 < 0 or NEW.T17 < 0 or NEW.T18 < 0 or NEW.T19 < 0 or NEW.T20 < 0) then
       BEGIN
          Exception "..." 'QUANTIDADE NAO PODE SER NEGATIVO: '||
          ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
       END

   if (New.Tipo <> 'B') then --Beneficiamento
       Begin
       OPERACAO_ID = Coalesce((Select First 1 O.ID From TbOperacao O
                            Where O.Codigo = New.Operacao_Codigo
                              and O.Tipo   = New.Tipo
                              and O.NotaFiscal = IIF(new.nfe_item_controle>0 or New.Nfs_item_controle > 0,'1','0')),0);
       End else
       Begin
       OPERACAO_ID = Coalesce((Select First 1 O.ID From TbOperacao O
                            Where O.Codigo = New.Operacao_Codigo
                              and O.NotaFiscal = IIF(new.nfe_item_controle>0 or New.Nfs_item_controle > 0,'1','0')),0);
       End

   if (:OPERACAO_ID = 0) then
       BEGIN
          Exception "..." 'OPERACAO INVALIDA OU NAO CADASTRADA: '||coalesce(New.Operacao_Codigo,'')||
          ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
       END

   USUARIO_NOME = (Select MON$USER from mon$attachments where mon$attachment_id = current_connection);
   USUARIO_NOME = current_user;

   if (:Usuario_Nome <> 'SYSDBA' and :Usuario_Nome <> 'GC') Then
       Begin

       USUARIO_ID = Coalesce((Select First 1 U.Codigo From TbUsuario U Where U.USUARIO = :USUARIO_NOME and U.Status = '1'),0);

          if (:USUARIO_ID = 0) then
              BEGIN
                  Exception "..." 'USUARIO INATIVO OU NAO CADASTRADO: '||:USUARIO_NOME||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END

        Estabelecimento = Coalesce((Select First 1 E.Estabelecimento_Codigo From TbUsuario_Estabelecimento E Where E.Usuario_Codigo = :USUARIO_ID),0);
        if (New.Nfs_Item_Controle > 0 or New.Nfe_Item_Controle > 0) then
            Begin
            Fam_Operacao = '';
            End else
            Begin
            Fam_Operacao = Coalesce((Select First 1 O.Familias From TbOperacao O Where O.Codigo = New.Operacao_Codigo),'');
            End

        For
        Select First 1
        U.SIGLA,
        P.DESCRICAO,
        U.PODE_FRACIONAR,
        P.FAMILIA_CODIGO,
        Coalesce((Select First 1 F.Familia_Id From Tbusuario_Familia F Where F.Familia_Id = P.Familia_Codigo and F.Usuario_Id = :USUARIO_ID),0),
        Coalesce((Select First 1 C.Valor_Ext From TbControle_Usuario C Where C.Usuario_Id = :USUARIO_ID and C.Id = 127),''),
        IIF(:ESTABELECIMENTO>0,Coalesce((Select First 1 E.Estabelecimento_Codigo From TbUsuario_Estabelecimento E Where E.Usuario_Codigo = :USUARIO_ID and E.Estabelecimento_Codigo = New.Estabelecimento_Codigo),0),-1),
        P.STATUS,
        P.GRADE_CODIGO,
        Coalesce((Select First 1 L.CCusto From TbLocalizacao L Where L.Codigo = New.Localizacao_Codigo),'')
        From TbProduto P, TbUnidadeMedida U
        Where P.Codigo = New.Produto_Codigo and P.Unidademedida_Sigla = U.Sigla
        Into :UM, :DESCR, :FRAC, :FAMILIA_ID, :FAM_USUARIO, :Loc, :ESTABELECIMENTO, :PROD_STATUS, :GRADE_ID, :CCUSTO
        Do
        Begin
          if (:PROD_STATUS <> '1') then
              BEGIN
                Exception "..." 'TRANSACAO DE ESTOQUE NAO PERMITIDA PARA PRODUTO INATIVO, PRODUTO:'||coalesce(New.Produto_Codigo,0)||'  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END

           if (:GRADE_ID > 0) Then
               begin
               if (NEW.T01 + NEW.T02 + NEW.T03 + NEW.T04 + NEW.T05 +
                   NEW.T06 + NEW.T07 + NEW.T08 + NEW.T09 + NEW.T10 +
                   NEW.T11 + NEW.T12 + NEW.T13 + NEW.T14 + NEW.T15 +
                   NEW.T16 + NEW.T17 + NEW.T18 + NEW.T19 + NEW.T20 <= 0) then
                   BEGIN
                   Exception "..." 'PRODUTO COM GRADE, EXIGE QUANTIDADE EM ALGUM TAMANHO! PROD.'||NEW.PRODUTO_CODIGO||' QUANT.'||NEW.QUANTIDADE||' OPER.'||NEW.OPERACAO_CODIGO||'. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                   END
               End else
           if (:GRADE_ID = 0) Then
               begin
               if (NEW.T01 + NEW.T02 + NEW.T03 + NEW.T04 + NEW.T05 +
                   NEW.T06 + NEW.T07 + NEW.T08 + NEW.T09 + NEW.T10 +
                   NEW.T11 + NEW.T12 + NEW.T13 + NEW.T14 + NEW.T15 +
                   NEW.T16 + NEW.T17 + NEW.T18 + NEW.T19 + NEW.T20 > 0) then
                   BEGIN
                   Exception "..." 'PRODUTO SEM GRADE, NAO HA NECESSIDADE DE QUANTIDADE POR TAMANHO! '||
                   ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                   END
               End

          if (:ESTABELECIMENTO = 0) then
              BEGIN
                  Exception "..." 'USUARIO NAO TEM PERMISSAO DE MOVIMENTAR ESTOQUE DO ESTABELECIMENTO INFORMADO: '||
                  :ESTABELECIMENTO||'-'||Coalesce((Select First 1 E.NomeFantasia From TbEstabelecimento E Where E.Codigo = New.Estabelecimento_Codigo),'')||' -> USUARIO: '||:USUARIO_ID||'-'||:Usuario_Nome||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
          if (Position(lPad(New.Localizacao_Codigo,2,'0'),:LOC) = 0) Then
              BEGIN
                Exception "..." 'USUARIO NAO TEM PERMISSAO DE MOVIMENTAR ESTOQUE COM A LOCALIZACAO INFORMADA: '||New.Localizacao_Codigo||'-'||
                Coalesce((Select First 1 L.Descricao From TbLocalizacao L Where L.Codigo = New.Localizacao_Codigo),'')||' -> USUARIO: '||:USUARIO_ID||'-'||:Usuario_Nome||
                ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
          if (:FAM_USUARIO = 0) then
              BEGIN
                  Exception "..." 'USUARIO NAO TEM PERMISSAO DE MOVIMENTAR ESTOQUE DA FAMILIA DESTE PRODUTO: '||
                  :FAMILIA_ID||'-'||Coalesce((Select First 1 F.Descricao From TbFamilia F Where F.Codigo = :FAMILIA_ID),'')||' -> USUARIO: '||:USUARIO_ID||'-'||:Usuario_Nome||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
          if (:FRAC = 'N') then
              BEGIN
              if (NEW.QUANTIDADE > TRUNC(NEW.QUANTIDADE)) THEN
                  Exception "..." 'PRODUTO NAO PERMITE QUANTIDADE FRACIONADA: '||
                  NEW.PRODUTO_CODIGO||'-'||:DESCR||' QUANT.'||NEW.QUANTIDADE||' '||:UM||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
          if (:FAM_OPERACAO <> '' and Position(lPad(:FAMILIA_ID,4,'0'),:FAM_OPERACAO) = 0) then
              BEGIN
                  Exception "..." 'OPERACAO NAO PODE SER USADA COM A FAMILIA DE PRODUTOS INFORMADA.'||
                  'OPERACAO: '||NEW.OPERACAO_CODIGO||'- FAMILIA: '||:FAMILIA_ID||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END

          if ((COALESCE(NEW.CENTRO_DE_CUSTO, '') = '') AND (COALESCE(:CCUSTO, '') <> '')) then
              BEGIN
              NEW.CENTRO_DE_CUSTO = :CCUSTO;
              END

          NEW.USUARIO_CODIGO = :USUARIO_ID;
        End
     End
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttboc_item_b0iu_01 for tboc_item
active before insert or update position 0
AS
DECLARE VARIABLE UM VARCHAR(3);
DECLARE VARIABLE DESCR VARCHAR(100);
DECLARE VARIABLE FRAC CHAR(1);
DECLARE VARIABLE LOC1 INTEGER;
DECLARE VARIABLE LOC2 INTEGER;


BEGIN


For
    Select First 1
        coalesce(U.SIGLA,'') as SIGLA,
        P.DESCRICAO,
        U.PODE_FRACIONAR,
        P.LOCALIZACAO_CODIGO,
        (SELECT FIRST 1 F.LOCALIZACAO_CODIGO FROM TBFAMILIA F WHERE F.CODIGO = P.FAMILIA_CODIGO)
    From TbProduto P
    left join TbUnidadeMedida U on P.Unidademedida_Sigla = U.Sigla
    Where P.Codigo = New.Produto_Codigo
    Into
        :UM,
        :DESCR,
        :FRAC,
        :LOC1,
        :LOC2
Do
Begin

  if(UM = '')then
  begin
     exception "..." 'Unidades de medida do produto nao foi encontrada. Produto:' || New.Produto_Codigo;
  end

  if (New.Controle > 0) then
      Begin
      /* Trigger text */

      if ((NEW.VALOR * NEW.QUANTIDADE) + NEW.ACRESCIMO - NEW.DESCONTO < 0) THEN
          Exception "..." 'VALOR TOTAL DO ITEM INVALIDO, NAO PODE SER NEGATIVO! '||
          NEW.PRODUTO_CODIGO||'-'||:DESCR||
          ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';


      if (:FRAC = 'N') then
          BEGIN
          if (NEW.QUANTIDADE > TRUNC(NEW.QUANTIDADE)) THEN
              Exception "..." 'PRODUTO NAO PERMITE QUANTIDADE FRACIONADA: '||
              NEW.PRODUTO_CODIGO||'-'||:DESCR||' QUANT.'||NEW.QUANTIDADE||' '||:UM||
              ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
          END
    
       if (Coalesce(New.Localizacao_Codigo,0) = 0) then
           Begin
           if (:Loc1 > 0) then
               Begin
               New.Localizacao_Codigo = :Loc1;
               End else
           if (:Loc2 > 0) then
               Begin
               New.Localizacao_Codigo = :Loc2;
               End else
               Begin
               Exception "..." 'LOCALIZACAO PADRAO DE ESTOQUE DO PRODUTO NAO LOCALIZADA '||
               NEW.PRODUTO_CODIGO||'-'||:DESCR||
               ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
               End
           End


    if (Inserting) then
        Begin
            UPDATE OR INSERT INTO TbOc_Item_Saldo (
            Oc,Oc_Item_Controle,Quantidade,        
            T01,T02,T03,T04,T05,T06,T07,T08,T09,T10,
            T11,T12,T13,T14,T15,T16,T17,T18,T19,T20)
            VALUES (NEW.OC,NEW.CONTROLE,NEW.QUANTIDADE,
            NEW.T01,NEW.T02,NEW.T03,NEW.T04,NEW.T05,NEW.T06,NEW.T07,NEW.T08,NEW.T09,NEW.T10,
            NEW.T11,NEW.T12,NEW.T13,NEW.T14,NEW.T15,NEW.T16,NEW.T17,NEW.T18,NEW.T19,NEW.T20)
            MATCHING (Oc,Oc_Item_Controle);
        End

    if (Updating) then
        Begin
        --EXCEPTION "..."NEW.QUANTIDADE||' - '||OLD.QUANTIDADE;   6 -> 3

        if (NEW.QUANTIDADE <> OLD.QUANTIDADE or
            NEW.T01 <> OLD.T01 or NEW.T02 <> OLD.T02 or
            NEW.T03 <> OLD.T03 or NEW.T04 <> OLD.T04 or
            NEW.T05 <> OLD.T05 or NEW.T06 <> OLD.T06 or
            NEW.T07 <> OLD.T07 or NEW.T08 <> OLD.T08 or
            NEW.T09 <> OLD.T09 or NEW.T10 <> OLD.T10 or
            NEW.T11 <> OLD.T11 or NEW.T12 <> OLD.T12 or
            NEW.T13 <> OLD.T13 or NEW.T14 <> OLD.T14 or
            NEW.T15 <> OLD.T15 or NEW.T16 <> OLD.T16 or
            NEW.T17 <> OLD.T17 or NEW.T18 <> OLD.T18 or
            NEW.T19 <> OLD.T19 or NEW.T20 <> OLD.T20) then
            Begin
                --UPDATE OR INSERT INTO TbOc_Item_Saldo T (
                --Oc,Oc_Item_Controle,Quantidade,
                --T01,T02,T03,T04,T05,T06,T07,T08,T09,T10,
                --T11,T12,T13,T14,T15,T16,T17,T18,T19,T20)
                --VALUES (NEW.OC,NEW.CONTROLE, NEW.QUANTIDADE ,
                --NEW.T01,NEW.T02,NEW.T03,NEW.T04,NEW.T05,NEW.T06,NEW.T07,NEW.T08,NEW.T09,NEW.T10,
                --NEW.T11,NEW.T12,NEW.T13,NEW.T14,NEW.T15,NEW.T16,NEW.T17,NEW.T18,NEW.T19,NEW.T20)
                --MATCHING (Oc,Oc_Item_Controle);
                UPDATE TBOC_ITEM_SALDO T
                SET OC = NEW.OC,
                    QUANTIDADE  =  T.QUANTIDADE - (OLD.QUANTIDADE - NEW.QUANTIDADE),
                    T01         =  T.T01 - (OLD.T01 - NEW.T01),
                    T02         =  T.T02 - (OLD.T02 - NEW.T02),
                    T03         =  T.T03 - (OLD.T03 - NEW.T03),
                    T04         =  T.T04 - (OLD.T04 - NEW.T04),
                    T05         =  T.T05 - (OLD.T05 - NEW.T05),
                    T06         =  T.T06 - (OLD.T06 - NEW.T06),
                    T07         =  T.T07 - (OLD.T07 - NEW.T07),
                    T08         =  T.T08 - (OLD.T08 - NEW.T08),
                    T09         =  T.T09 - (OLD.T09 - NEW.T09),
                    T10         =  T.T10 - (OLD.T10 - NEW.T10),
                    T11         =  T.T11 - (OLD.T11 - NEW.T11),
                    T12         =  T.T12 - (OLD.T12 - NEW.T12),
                    T13         =  T.T13 - (OLD.T13 - NEW.T13),
                    T14         =  T.T14 - (OLD.T14 - NEW.T14),
                    T15         =  T.T15 - (OLD.T15 - NEW.T15),
                    T16         =  T.T16 - (OLD.T16 - NEW.T16),
                    T17         =  T.T17 - (OLD.T17 - NEW.T17),
                    T18         =  T.T18 - (OLD.T18 - NEW.T18),
                    T19         =  T.T19 - (OLD.T19 - NEW.T19),
                    T20         =  T.T20 - (OLD.T20 - NEW.T20)
                WHERE (OC_ITEM_CONTROLE = NEW.CONTROLE);

            End
        End

    End

End

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpdv_devolucao_troca_b03i for tbpdv_devolucao_troca
inactive before insert or update or delete position 2
AS

/* INATIVA POIS É NECESSÁRIO BAIXAR SALDO APENAS COM A NOTA DE ENTRADA DE DEVOLUÇÃO  */
DECLARE VARIABLE NFS_CONTROLE         INTEGER;
DECLARE VARIABLE NUMERO_CFE           INTEGER;
DECLARE VARIABLE ITEM_ID              INTEGER;
DECLARE VARIABLE QUANTIDADE           NUMERIC(15,8);
DECLARE VARIABLE QUANTIDADE_ITEM_NFS  NUMERIC(15,8);
DECLARE VARIABLE SALDO_ATUALIZADO     NUMERIC(15,8);
begin
 IF(INSERTING) THEN
 BEGIN
     IF(NEW.TIPO_DOCUMENTO = 1)THEN
     BEGIN
        FOR SELECT
            a.nfs_controle,
            a.CONTROLE,
            t.QUANTIDADE,
            a.quantidade as quantidade_item_nfs,
            Z.QUANTIDADE - t.quantidade saldo_atualizado
        
            FROM TBPDV_DEVOLUCAO_TROCA_ITEM T
            INNER JOIN TBNFS            C ON C.CONTROLE          = T.DOCUMENTO_CONTROLE
            LEFT  JOIN TBNFS_ITEM       A ON A.NFS_CONTROLE      = C.CONTROLE AND A.SEQUENCIA = T.ITEM_SEQUENCIA
            LEFT  JOIN TBNFS_ITEM_SALDO Z ON A.NFS_CONTROLE      = Z.NFS_CONTROLE AND A.CONTROLE = Z.NFS_ITEM_CONTROLE
            INNER JOIN TBPRODUTO        B ON B.CODIGO            = A.PRODUTO_CODIGO
            LEFT  JOIN TBMODELO         D ON D.CODIGO            = B.MODELO_CODIGO
            LEFT  JOIN TbUnidadeMedida  E ON E.SIGLA             = B.UNIDADEMEDIDA_SIGLA
                    
            WHERE T.PDV_DEVOLUCAO_ID = NEW.ID
            AND C.EMPRESA_CODIGO     = NEW.CLIENTE_ID
            AND A.NFS_CONTROLE       = C.CONTROLE
            INTO :NFS_CONTROLE,
                 :ITEM_ID,
                 :QUANTIDADE,
                 :QUANTIDADE_ITEM_NFS,
                 :SALDO_ATUALIZADO
            DO
            BEGIN
               UPDATE TBNFS_ITEM_SALDO A SET A.QUANTIDADE = :SALDO_ATUALIZADO WHERE A.NFS_CONTROLE = :NFS_CONTROLE AND A.NFS_ITEM_CONTROLE = :ITEM_ID;
            END
     END
     ELSE
     BEGIN
        FOR SELECT A.PDV_CFE_ID,
                A.ID,
                T.QUANTIDADE,
                A.QUANTIDADE  as quantidade_item_nfs,
                (X.QUANTIDADE - t.quantidade) saldo_atualizado
            
                FROM TBPDV_DEVOLUCAO_TROCA_ITEM T
                LEFT  JOIN TBPDV_CFE_ITEM       A ON A.SEQUENCIA  = T.ITEM_SEQUENCIA
                LEFT  JOIN TBPDV_CFE_ITEM_SALDO X ON X.PDV_CFE_ITEM_ID = A.ID AND X.PDV_CFE_ID = A.PDV_CFE_ID
                INNER JOIN TBPRODUTO            B ON B.CODIGO     = A.PRODUTO_ID
                INNER JOIN TBPDV_CFE            C ON C.ID         = T.DOCUMENTO_CONTROLE
                LEFT  JOIN TBMODELO             D ON D.CODIGO     = B.MODELO_CODIGO
                LEFT  JOIN TbUnidadeMedida      E ON E.SIGLA      = B.UNIDADEMEDIDA_SIGLA
            
                WHERE T.PDV_DEVOLUCAO_ID = NEW.ID
                AND A.PDV_CFE_ID         = C.ID
                AND C.CLIENTE_ID         = NEW.CLIENTE_ID
        INTO :NFS_CONTROLE,
             :ITEM_ID,
             :QUANTIDADE,
             :QUANTIDADE_ITEM_NFS,
             :SALDO_ATUALIZADO
        DO
        BEGIN
           UPDATE TBPDV_CFE_ITEM_SALDO A SET A.QUANTIDADE = :SALDO_ATUALIZADO WHERE A.PDV_CFE_ID = :NFS_CONTROLE AND A.PDV_CFE_ITEM_ID = :ITEM_ID;
        END
     END
 END
 IF(DELETING)THEN
 BEGIN
  IF(OLD.TIPO_DOCUMENTO = 1)THEN
     BEGIN
        FOR SELECT
            a.nfs_controle,
            a.CONTROLE,
            t.QUANTIDADE,
            a.quantidade as quantidade_item_nfs,
            (t.quantidade) saldo_atualizado
        
            FROM TBPDV_DEVOLUCAO_TROCA_ITEM T
            INNER JOIN TBNFS           C ON C.CONTROLE          = T.DOCUMENTO_CONTROLE
            LEFT  JOIN TBNFS_ITEM      A ON A.NFS_CONTROLE      = C.CONTROLE AND A.SEQUENCIA = T.ITEM_SEQUENCIA
            INNER JOIN TBPRODUTO       B ON B.CODIGO            = A.PRODUTO_CODIGO
            LEFT  JOIN TBMODELO        D ON D.CODIGO            = B.MODELO_CODIGO
            LEFT  JOIN TbUnidadeMedida E ON E.SIGLA             = B.UNIDADEMEDIDA_SIGLA
                    
            WHERE T.PDV_DEVOLUCAO_ID = OLD.ID
            AND C.EMPRESA_CODIGO     = OLD.CLIENTE_ID
            AND A.NFS_CONTROLE       = C.CONTROLE
            INTO :NFS_CONTROLE,
                 :ITEM_ID,
                 :QUANTIDADE,
                 :QUANTIDADE_ITEM_NFS,
                 :SALDO_ATUALIZADO
            DO
            BEGIN
               UPDATE TBNFS_ITEM_SALDO A SET A.QUANTIDADE = (A.QUANTIDADE + :SALDO_ATUALIZADO) WHERE A.NFS_CONTROLE = :NFS_CONTROLE AND A.NFS_ITEM_CONTROLE = :ITEM_ID;
            END
     END
     ELSE
     BEGIN
        FOR SELECT A.PDV_CFE_ID,
                A.ID,
                T.QUANTIDADE,
                A.QUANTIDADE as quantidade_item_nfs,
                (t.quantidade) saldo_atualizado
            
                FROM TBPDV_DEVOLUCAO_TROCA_ITEM T
                LEFT  JOIN TBPDV_CFE_ITEM       A ON A.SEQUENCIA  = T.ITEM_SEQUENCIA
                INNER JOIN TBPRODUTO            B ON B.CODIGO     = A.PRODUTO_ID
                INNER JOIN TBPDV_CFE            C ON C.ID         = T.DOCUMENTO_CONTROLE
                LEFT  JOIN TBMODELO             D ON D.CODIGO     = B.MODELO_CODIGO
                LEFT  JOIN TbUnidadeMedida      E ON E.SIGLA      = B.UNIDADEMEDIDA_SIGLA
            
                WHERE T.PDV_DEVOLUCAO_ID = OLD.ID
                AND A.PDV_CFE_ID         = C.ID
                AND C.CLIENTE_ID         = OLD.CLIENTE_ID
        INTO :NFS_CONTROLE,
             :ITEM_ID,
             :QUANTIDADE,
             :QUANTIDADE_ITEM_NFS,
             :SALDO_ATUALIZADO
        DO
        BEGIN
           UPDATE TBPDV_CFE_ITEM_SALDO A SET A.QUANTIDADE = (A.QUANTIDADE + :SALDO_ATUALIZADO) WHERE A.PDV_CFE_ID = :NFS_CONTROLE AND A.PDV_CFE_ITEM_ID = :ITEM_ID;
        END
     END
 END
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_item_b0i_00 for tbpedido_item
active before insert position 0
AS
DECLARE VARIABLE UM VARCHAR(3);
DECLARE VARIABLE DESCR VARCHAR(100);
DECLARE VARIABLE FRAC CHAR(1);
DECLARE VARIABLE LOC1 INTEGER;
DECLARE VARIABLE LOC2 INTEGER;
BEGIN
For Select First 1 U.SIGLA, P.DESCRICAO, U.PODE_FRACIONAR, P.LOCALIZACAO_CODIGO,
(SELECT FIRST 1 F.LOCALIZACAO_CODIGO FROM TBFAMILIA F WHERE F.CODIGO = P.FAMILIA_CODIGO)
From TbProduto P, TbUnidadeMedida U
Where P.Codigo = New.Produto_Codigo and P.Unidademedida_Sigla = U.Sigla
Into :UM, :DESCR, :FRAC, :LOC1, :LOC2
Do
Begin

  if (:FRAC = 'N') then
      BEGIN
      if (NEW.QUANTIDADE > TRUNC(NEW.QUANTIDADE)) THEN
          Exception "..." 'PRODUTO NÃO PERMITE QUANTIDADE FRACIONADA: '||
          NEW.PRODUTO_CODIGO||'-'||:DESCR||' QUANT.'||NEW.QUANTIDADE||' '||:UM||
          ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
      END

   if (Coalesce(New.Localizacao_ID,0) = 0) then
       Begin
       if (:Loc1 > 0) then
           Begin
           New.Localizacao_ID = :Loc1;
           End else
       if (:Loc2 > 0) then
           Begin
           New.Localizacao_ID = :Loc2;
           End else
           Begin
           Exception "..." 'LOCALIZAÇÃO PADRÃO DE ESTOQUE DO PRODUTO NÃO LOCALIZADA '||
           NEW.PRODUTO_CODIGO||'-'||:DESCR||
           ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
           End
       End
End

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_item_b0u_00 for tbpedido_item
active before update position 0
AS
DECLARE VARIABLE UM VARCHAR(3);
DECLARE VARIABLE DESCR VARCHAR(100);
DECLARE VARIABLE FRAC CHAR(1);
DECLARE VARIABLE LOC1 INTEGER;
DECLARE VARIABLE LOC2 INTEGER;
BEGIN

  if (New.Quantidade <> Old.Quantidade or
      New.Produto_Codigo <> Old.Produto_Codigo) Then
      Begin

        For Select First 1 U.SIGLA, P.DESCRICAO, U.PODE_FRACIONAR, P.LOCALIZACAO_CODIGO,
        (SELECT FIRST 1 F.LOCALIZACAO_CODIGO FROM TBFAMILIA F WHERE F.CODIGO = P.FAMILIA_CODIGO)
        From TbProduto P, TbUnidadeMedida U
        Where P.Codigo = New.Produto_Codigo and P.Unidademedida_Sigla = U.Sigla
        Into :UM, :DESCR, :FRAC, :LOC1, :LOC2
        Do
        Begin
          if (:FRAC = 'N') then
              BEGIN
              if (NEW.QUANTIDADE > TRUNC(NEW.QUANTIDADE)) THEN
                  Exception "..." 'PRODUTO NÃO PERMITE QUANTIDADE FRACIONADA: '||
                  NEW.PRODUTO_CODIGO||'-'||:DESCR||' QUANT.'||NEW.QUANTIDADE||' '||:UM||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
          if (Coalesce(New.Localizacao_ID,0) = 0) then
              Begin
               if (:Loc1 > 0) then
                   Begin
                   New.Localizacao_ID = :Loc1;
                   End else
               if (:Loc2 > 0) then
                   Begin
                   New.Localizacao_ID = :Loc2;
                   End else
                   Begin
                   Exception "..." 'LOCALIZAÇÃO PADRÃO DE ESTOQUE DO PRODUTO NÃO LOCALIZADA '||
                   NEW.PRODUTO_CODIGO||'-'||:DESCR||
                   ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
                   End
              End
        End
      End
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbpedido_item_processado_b8u for tbpedido_item_processado
active before update position 8
AS
declare variable REMESSA_WEB VARCHAR(10);
declare variable REMESSA VARCHAR(15);
declare variable REMESSA_FAMILIA_ID INTEGER;
declare variable TALAO_ID INTEGER;
declare variable TALAO_GP_ID INTEGER;
declare variable TALAO_UP_ID INTEGER;
declare variable TALAO_ESTACAO INTEGER;
declare variable TALAO_LOCALIZACAO_ID INTEGER;   
declare variable TALAO_ESTOQUE_ID INTEGER;
declare variable PROGRAMACAO_STATUS VARCHAR(10);
declare variable PROGRAMACAO_ID INTEGER;
declare variable OPERACAO_ENTRADA VARCHAR(255);
declare variable UP_PERFIL VARCHAR(10);
declare variable UP_CCUSTO VARCHAR(10);
declare variable CONSUMO_ID INTEGER;
declare variable CONSUMO_PRODUTO_ID INTEGER;
declare variable CONSUMO_TAMANHO INTEGER;
declare variable CONSUMO_FATOR_UNIDADE NUMERIC(15,8);
declare variable CONSUMO_LOCALIZACAO_ID INTEGER;
declare variable CONSUMO_ESTOQUE_ID INTEGER;    
declare variable CONSUMO_QUANTIDADE NUMERIC(15,5);    
declare variable CONSUMO_QUANTIDADE_SALDO NUMERIC(15,5);
declare variable CONSUMO_UM VARCHAR(10);                
declare variable CONSUMO_FAMILIA_ID INTEGER;
declare variable CONSUMO_PERMITE_FRACAO VARCHAR(5);
declare variable ULTIMO_TALAO BOOLEAN;
declare variable PRODUCAO_TOTAL BOOLEAN;
declare variable CONSUMO_PRODUTO_TALAO INTEGER;
begin

    SELECT FIRST 1
           R.REMESSA,
           COALESCE(WEB,'0'),
           R.FAMILIA_ID
      FROM VWREMESSA R
     WHERE R.REMESSA_ID = NEW.REMESSA
     INTO REMESSA,
          REMESSA_WEB,
          REMESSA_FAMILIA_ID;

    IF ( REMESSA_WEB = '2' ) THEN
    BEGIN
        /* FINALIZANDO O TALAO DETALHADO */
        IF ( OLD.SITUACAO < 2 AND NEW.SITUACAO = 2 ) THEN
        BEGIN
    
            SELECT FIRST 1
                   T.ID,
                   T.GP_ID,
                   T.UP_ID,
                   T.ESTACAO
              FROM VWREMESSA_TALAO T
             WHERE T.REMESSA_ID = NEW.REMESSA
               AND T.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
              INTO TALAO_ID,
                   TALAO_GP_ID,
                   TALAO_UP_ID,
                   TALAO_ESTACAO;
            /*
            IF ( NOT FN_GP_REMESSA_LIBERADA(NEW.REMESSA,:TALAO_GP_ID,:TALAO_UP_ID) ) THEN
            BEGIN
                EXCEPTION "..." 'REMESSA BLOQUEADA PARA PRODUCAO.';
            END
            */
    
            /* VERIFICA SE EH O ULTIMO TALAO DA SEQUENCIA */
            ULTIMO_TALAO = IIF(COALESCE((
                SELECT COUNT(D.ID)
                  FROM VWREMESSA_TALAO_DETALHE D
                 WHERE D.REMESSA_ID = NEW.REMESSA
                   AND D.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
                   AND D.STATUS < 2
            ),0) = 1,TRUE, FALSE);
    
            SELECT ID,
                   STATUS
              FROM TBPROGRAMACAO P
             WHERE P.TABELA_ID = :TALAO_ID
               AND P.TIPO = 'A'
              INTO PROGRAMACAO_ID,
                   PROGRAMACAO_STATUS;
    
            IF ( PROGRAMACAO_STATUS <> '2' ) THEN
            BEGIN
                EXCEPTION "..." 'O talão('||:TALAO_ID||') não está em produção. Operação cancelada.';
            END
    
            /* SE FOR O ULTIMO TALAO, ATUALIZA O TALAO ACUMULADO PARA PRODUZIDO E A PROGRAMACAO PARA FINALIZADO */
            IF ( ULTIMO_TALAO ) THEN
            BEGIN
                          
                UPDATE TBPROGRAMACAO P
                   SET P.STATUS = '3',
                       P.DATAHORA_FINALIZADO = iif(coalesce(p.flag_data,0) = 0, CURRENT_TIMESTAMP, P.DATAHORA_FINALIZADO)
                 WHERE P.TABELA_ID = :TALAO_ID
                   AND P.TIPO      = 'A';
    
                INSERT INTO TBPROGRAMACAO_REGISTRO (
                    PROGRAMACAO_ID,
                    STATUS,
                    OPERADOR_ID
                ) VALUES (
                   :PROGRAMACAO_ID,       
                   2,
                   NEW.OPERADOR_ID_PRODUCAO
                );
    
                UPDATE VWREMESSA_TALAO T
                   SET T.STATUS = 2,
                       T.DATA_PRODUCAO = FN_DATA_PRODUCAO()
                 WHERE T.ID     = :TALAO_ID;
    
    --            UPDATE TBUP_ESTACAO
    --               SET TALAO_ID = 0,
    --                   INCREMENTO = 1
    --             WHERE (UP_ID = :TALAO_UP_ID) AND (ID = :TALAO_ESTACAO);
    
                
                EXECUTE PROCEDURE SPU_PROCESSAR_TEMPO_REALIZAD_V2((
                    SELECT FIRST 1 ID
                      FROM TBPROGRAMACAO P
                     WHERE P.TABELA_ID = :TALAO_ID));
    
                EXECUTE PROCEDURE SPU_PROGRAMACAO_PRODUZIDO1(
                    NEW.ESTABELECIMENTO_CODIGO,
                    'A',
                    :TALAO_ID
                );
            END
    
            /* CAPTURA A LOCALIZACAO DE ENTRADA NO ESTOQUE */
            TALAO_LOCALIZACAO_ID = COALESCE(( SELECT FIRST 1 P.LOCALIZACAO_CODIGO FROM TBPRODUTO P WHERE P.CODIGO = NEW.PRODUTO_CODIGO ),0);
            
            /* CAPTURA A OPERACAO DE ESTOQUE */
            OPERACAO_ENTRADA = (SELECT FIRST 1 VALOR_EXT FROM TBCONTROLE_N WHERE ID = 30);
            
            /* CAPTURA O CCUSTO DA TRANSACAO */
            SELECT FIRST 1
                   U.CCUSTO,
                   U.PERFIL
              FROM TBUP U
             WHERE U.ID = :TALAO_UP_ID
              INTO UP_CCUSTO,
                   UP_PERFIL;
            

            
            NEW.ESTEIRA_PRODUCAO = TALAO_GP_ID;
            NEW.SETOR_CODIGO     = TALAO_UP_ID;
    
            /* GUARDA DATA E HORA DE PRODUCAO */
            NEW.HORA_PRODUCAO = CURRENT_TIMESTAMP;
    
            /* GUARDA DATA DE PRODUCAO DO TURNO CORRENTE */
            NEW.DATA_PRODUCAO =  FN_DATA_PRODUCAO();

            /* ATUALIZA A QUANTIDADE PRODUZIDA NO TALAO DETALHADO */
            IF ( NOT (COALESCE(NEW.QUANTIDADE_PRODUCAO,0) > 0) ) THEN
            BEGIN
                NEW.QUANTIDADE_PRODUCAO = NEW.QUANTIDADE_PEDIDO;
            END

            IF ( NEW.QUANTIDADE_PRODUCAO <> NEW.QUANTIDADE_PEDIDO ) THEN
            BEGIN
                FN_OPERADOR_AUTENTICACAO(NEW.OPERADOR_ID_PRODUCAO,34); /* REGISTRAR PRODUCAO PARCIAL */
            END

            NEW.QUANTIDADE_SALDO    = NEW.QUANTIDADE_PRODUCAO;


            PRODUCAO_TOTAL = COALESCE((SELECT IIF(SUM(P.QUANTIDADE_PEDIDO) = (SUM(P.QUANTIDADE_PRODUCAO)+NEW.QUANTIDADE_PRODUCAO),TRUE,FALSE)
                                             FROM TBPEDIDO_ITEM_PROCESSADO P
                                            WHERE P.REMESSA = NEW.REMESSA
                                              AND P.REMESSA_ACUMULADO_CONTROLE = NEW.REMESSA_ACUMULADO_CONTROLE),TRUE);
    
    
    ---------------- NAO SERA MAIS APLICADO --------------
    ---------- ENTRADA VIA CONFERENCIA DO COLETOR --------
    ------------------------------------------------------    
    --        /* GERA O ID DA TRANSACAO DE ENTRADA NO ESTOQUE */
    --        TALAO_ESTOQUE_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
    --        /* GUARDA O ID DA TRANSACAO DE ESTOQUE NO TALAO DETALHADO */
    --        NEW.ESTOQUE_ID = :TALAO_ESTOQUE_ID;
    --        /* REGISTRA A ENTRADA NO ESTOQUE DO TALAO DETALHADO */
    --        EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO(
    --            'TBPEDIDO_ITEM_PROCESSADO',
    --            0,
    --            NEW.CONTROLE,
    --            NEW.ESTABELECIMENTO_CODIGO,
    --            :TALAO_LOCALIZACAO_ID,
    --            NEW.DATA_PRODUCAO,
    --            NEW.PRODUTO_CODIGO,
    --            NEW.TAMANHO,
    --            NEW.QUANTIDADE_PRODUCAO,
    --            'E',
    --            OPERACAO_ENTRADA,
    --            '0',
    --            :CCUSTO,
    --            'WEB22180 - ENTRADA POR REMESSA DE PRODUCAO',
    --            NEW.ESTOQUE_ID
    --        );
    
        
    
            /* REALIZA AS BAIXAS DE CONSUMO GERAL AO TALAO */
            FOR
                SELECT
                    C.ID,
                    C.PRODUTO_ID,
                    C.TAMANHO,
                    C.FATOR_UNIDADE,
                    C.QUANTIDADE_SALDO,
                    P.UNIDADEMEDIDA_SIGLA,
                    P.FAMILIA_CODIGO,
                    P.LOCALIZACAO_CODIGO
                FROM
                    VWREMESSA_CONSUMO C,
                    TBPRODUTO P
                WHERE
                    P.CODIGO = C.PRODUTO_ID
                AND C.REMESSA_ID = NEW.REMESSA
                AND C.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
                AND COALESCE(C.REMESSA_TALAO_DETALHE_ID,0) = 0
                AND C.STATUS = '0'
                AND C.COMPONENTE = '0'
            INTO
                CONSUMO_ID,
                CONSUMO_PRODUTO_ID,
                CONSUMO_TAMANHO,
                CONSUMO_FATOR_UNIDADE,
                CONSUMO_QUANTIDADE_SALDO,
                CONSUMO_UM,
                CONSUMO_FAMILIA_ID,
                CONSUMO_LOCALIZACAO_ID
            DO
            BEGIN
    
                /* VERIFICA SE O PRODUTO PERMITE BAIXA FRACIONADA */
                CONSUMO_PERMITE_FRACAO = COALESCE((
                    SELECT U.PODE_FRACIONAR
                      FROM TbUnidadeMedida U
                     WHERE U.SIGLA = :CONSUMO_UM),'N');
    
                /* GERA O ID DA TRANSACAO DE SAIDA DO CONSUMO */
                CONSUMO_ESTOQUE_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
    
                /* REALIZA O CALCULO DE CONSUMO */
                /*
                   OBS1:
                       SE FOR O ULTIMO TALAO DETALHADO A SER PRODUZIDO A BAIXA DEVE SER IGUAL AO RESTANTE A SER CONSUMIDO,
                       SENAO, DEVERA SER CALCULDO BASEADO NA QUANTIDADE DO TALAO DETALHADO.
                   OBS2:
                       SE O PRODUTO NAO PERMITIR QUANTIDADE FRANCIONADA, O VALOR SERA ARREDONDADO PARA CIMA.
                */            
                CONSUMO_PRODUTO_TALAO = (
                    SELECT FIRST 1 Z.ID
                      FROM TBREMESSA_CONSUMO_TALAO Z
                     WHERE Z.TIPO = 1
                       AND Z.FAMILIA_ID = :REMESSA_FAMILIA_ID
                       AND (Z.INSUMO_PRODUTO_ID = :CONSUMO_PRODUTO_ID OR Z.INSUMO_FAMILIA_ID = :CONSUMO_FAMILIA_ID));
                CONSUMO_QUANTIDADE = IIF(ULTIMO_TALAO AND PRODUCAO_TOTAL,COALESCE(CONSUMO_QUANTIDADE_SALDO,0), COALESCE(IIF(CONSUMO_PRODUTO_TALAO > 0,NEW.QUANTIDADE_PEDIDO, NEW.QUANTIDADE_PRODUCAO) * CONSUMO_FATOR_UNIDADE,0));
                CONSUMO_QUANTIDADE = IIF(CONSUMO_PERMITE_FRACAO = 'S',CONSUMO_QUANTIDADE,FN_ARRENDONDAR_PARA_CIMA(CONSUMO_QUANTIDADE));
    
    
                IF ( CONSUMO_QUANTIDADE <= 0 ) THEN
                BEGIN
                    EXCEPTION "..." 'Quantidade consumida deverá ser maior que zero. Produto: ' || CONSUMO_PRODUTO_ID || ' Operação cancelada.';
                END
    
    
                /* VERIFICA SE O CONSUMO ESTÁ MAIOR QUE O PROJETADO. */
                /*
                    OBS: ESSE ERRO SO DEVE DISPARAR SE HOUVER PROBLEMA COM O FATOR UNIDADE OU SE O PRODUTO NAO PERMITIR FRACAO PARA CONSUMO
                 */
                IF ( CONSUMO_QUANTIDADE > CONSUMO_QUANTIDADE_SALDO ) THEN
                BEGIN
                    EXCEPTION "..." 'Quantidade consumida não deve ser maior que o saldo da projeção. Produto: ' || CONSUMO_PRODUTO_ID || ' QTD. CONS.:'||CONSUMO_QUANTIDADE||' QTD. SAL. CONS.:'||CONSUMO_QUANTIDADE_SALDO||' Operação cancelada.';
                END
    
                /* ATUALIZA A QUANTIDADE CONSUMIDA */
                UPDATE VWREMESSA_CONSUMO C
                   SET C.QUANTIDADE_CONSUMO = COALESCE(C.QUANTIDADE_CONSUMO,0) + :CONSUMO_QUANTIDADE,
                       C.ESTOQUE_ID = :CONSUMO_ESTOQUE_ID,
                       C.STATUS = IIF(:ULTIMO_TALAO,1,C.STATUS)
                 WHERE C.ID = :CONSUMO_ID;
    
    
    
    --            /* GUARDA A LOCALIZACAO DE PROCESSO (WIP) */
    --            CONSUMO_LOCALIZACAO_ID = COALESCE((
    --                SELECT FIRST 1 F.LOCALIZACAO_PROCESSO
    --                  FROM TBFAMILIA_FICHA F
    --                 WHERE F.FAMILIA_CODIGO         = :CONSUMO_FAMILIA_ID
    --                   AND F.ESTABELECIMENTO_CODIGO = NEW.ESTABELECIMENTO_CODIGO),0);
    --
    --            /* VERIFICA SE A LOCALIZACAO DE PROCESSO ESTA CONFIGURADA */
    --            IF ( CONSUMO_LOCALIZACAO_ID = 0 ) THEN
    --            BEGIN
    --                EXCEPTION "..." 'FAMILIA DO PRODUTO SEM LOCALIZACAO DE PROCESSO (WIP) DEFINIDA. ID PROD.' || CONSUMO_PRODUTO_ID || '. OPERACAO CANCELADA! ';
    --            END            
    
                /* REALIZA A TRANSACAO DE SAIDA DO CONSUMO */
                EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(
                    3,
                    :TALAO_GP_ID,
                    :UP_PERFIL,
                    :CONSUMO_FAMILIA_ID,  
                    :CONSUMO_LOCALIZACAO_ID,
                    'TBREMESSA_CONSUMO',
                    2,
                    :CONSUMO_ID,
                    NEW.ESTABELECIMENTO_CODIGO,
                    NEW.DATA_PRODUCAO,
                    :CONSUMO_PRODUTO_ID,
                    :CONSUMO_TAMANHO,
                    :CONSUMO_QUANTIDADE,
                    'S',
                    '1',
                    :UP_CCUSTO,
                    'WEB22180 - SAIDA POR CONSUMO DE REMESSA DE PRODUCAO. REMESSA: ' || REMESSA || ' TALAO: ' || FN_LPAD(NEW.REMESSA_ACUMULADO_CONTROLE,4,0),
                    :CONSUMO_ESTOQUE_ID,
                    NEW.REMESSA,
                    NEW.CONTROLE
                );
    
            END
    
    
            /* REALIZA AS BAIXAS DE CONSUMO GERAL AO TALAO */
            FOR
                SELECT
                    C.ID,
                    C.PRODUTO_ID,
                    C.TAMANHO,
                    C.FATOR_UNIDADE,
                    C.QUANTIDADE_SALDO,
                    P.UNIDADEMEDIDA_SIGLA,
                    P.FAMILIA_CODIGO,
                    P.LOCALIZACAO_CODIGO
                FROM
                    VWREMESSA_CONSUMO C,
                    TBPRODUTO P
                WHERE
                    P.CODIGO = C.PRODUTO_ID
                AND C.REMESSA_ID = NEW.REMESSA
                AND C.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
                AND C.REMESSA_TALAO_DETALHE_ID = NEW.CONTROLE
                AND C.STATUS = '0'
                AND C.COMPONENTE = '0'
            INTO
                CONSUMO_ID,
                CONSUMO_PRODUTO_ID,
                CONSUMO_TAMANHO,
                CONSUMO_FATOR_UNIDADE,
                CONSUMO_QUANTIDADE_SALDO,
                CONSUMO_UM,
                CONSUMO_FAMILIA_ID,
                CONSUMO_LOCALIZACAO_ID
            DO
            BEGIN
    
                /* VERIFICA SE O PRODUTO PERMITE BAIXA FRACIONADA */
                CONSUMO_PERMITE_FRACAO = COALESCE((
                    SELECT U.PODE_FRACIONAR
                      FROM TbUnidadeMedida U
                     WHERE U.SIGLA = :CONSUMO_UM),'N');
    
                /* GERA O ID DA TRANSACAO DE SAIDA DO CONSUMO */
                CONSUMO_ESTOQUE_ID = COALESCE((SELECT GEN_ID(GTBESTOQUE_TRANSACAO_ITEM, 1) FROM RDB$DATABASE),0);
    
                /* REALIZA O CALCULO DE CONSUMO */
                /*
                   OBS1:
                       SE FOR O ULTIMO TALAO DETALHADO A SER PRODUZIDO A BAIXA DEVE SER IGUAL AO RESTANTE A SER CONSUMIDO,
                       SENAO, DEVERA SER CALCULDO BASEADO NA QUANTIDADE DO TALAO DETALHADO.
                   OBS2:
                       SE O PRODUTO NAO PERMITIR QUANTIDADE FRANCIONADA, O VALOR SERA ARREDONDADO PARA CIMA.
                */
                CONSUMO_PRODUTO_TALAO = (
                    SELECT FIRST 1 Z.ID
                      FROM TBREMESSA_CONSUMO_TALAO Z
                     WHERE Z.TIPO = 1
                       AND Z.FAMILIA_ID = :REMESSA_FAMILIA_ID
                       AND (Z.INSUMO_PRODUTO_ID = :CONSUMO_PRODUTO_ID OR Z.INSUMO_FAMILIA_ID = :CONSUMO_FAMILIA_ID));
                CONSUMO_QUANTIDADE = IIF(ULTIMO_TALAO AND PRODUCAO_TOTAL,COALESCE(CONSUMO_QUANTIDADE_SALDO,0), COALESCE(IIF(CONSUMO_PRODUTO_TALAO > 0,NEW.QUANTIDADE_PEDIDO, NEW.QUANTIDADE_PRODUCAO) * CONSUMO_FATOR_UNIDADE,0));
                CONSUMO_QUANTIDADE = IIF(CONSUMO_PERMITE_FRACAO = 'S',CONSUMO_QUANTIDADE,FN_ARRENDONDAR_PARA_CIMA(CONSUMO_QUANTIDADE));
    
    
                IF ( CONSUMO_QUANTIDADE <= 0 ) THEN
                BEGIN
                    EXCEPTION "..." 'Quantidade consumida deverá ser maior que zero. Produto: ' || CONSUMO_PRODUTO_ID || ' Operação cancelada.';
                END
    
    
                /* VERIFICA SE O CONSUMO ESTÁ MAIOR QUE O PROJETADO. */
                /*
                    OBS: ESSE ERRO SO DEVE DISPARAR SE HOUVER PROBLEMA COM O FATOR UNIDADE OU SE O PRODUTO NAO PERMITIR FRACAO PARA CONSUMO
                 */
                IF ( CONSUMO_QUANTIDADE > CONSUMO_QUANTIDADE_SALDO ) THEN
                BEGIN
                    EXCEPTION "..." 'Quantidade consumida não deve ser maior que o saldo da projeção. Produto: ' || CONSUMO_PRODUTO_ID || ' QTD. CONS.:'||CONSUMO_QUANTIDADE||' QTD. SAL. CONS.:'||CONSUMO_QUANTIDADE_SALDO||' Operação cancelada.';
                END
    
                /* ATUALIZA A QUANTIDADE CONSUMIDA */
                UPDATE VWREMESSA_CONSUMO C
                   SET C.QUANTIDADE_CONSUMO = COALESCE(C.QUANTIDADE_CONSUMO,0) + :CONSUMO_QUANTIDADE,
                       C.ESTOQUE_ID = :CONSUMO_ESTOQUE_ID,
                       C.STATUS = 1
                 WHERE C.ID = :CONSUMO_ID;
    
    
    
    --            /* GUARDA A LOCALIZACAO DE PROCESSO (WIP) */
    --            CONSUMO_LOCALIZACAO_ID = COALESCE((
    --                SELECT FIRST 1 F.LOCALIZACAO_PROCESSO
    --                  FROM TBFAMILIA_FICHA F
    --                 WHERE F.FAMILIA_CODIGO         = :CONSUMO_FAMILIA_ID
    --                   AND F.ESTABELECIMENTO_CODIGO = NEW.ESTABELECIMENTO_CODIGO),0);
    --
    --            /* VERIFICA SE A LOCALIZACAO DE PROCESSO ESTA CONFIGURADA */
    --            IF ( CONSUMO_LOCALIZACAO_ID = 0 ) THEN
    --            BEGIN
    --                EXCEPTION "..." 'FAMILIA DO PRODUTO SEM LOCALIZACAO DE PROCESSO (WIP) DEFINIDA. ID PROD.' || CONSUMO_PRODUTO_ID || '. OPERACAO CANCELADA! ';
    --            END            
    
                /* REALIZA A TRANSACAO DE SAIDA DO CONSUMO */
                EXECUTE PROCEDURE SPI_ESTOQUE_TRANSACAO_REGRA(
                    3,
                    :TALAO_GP_ID,
                    :UP_PERFIL,
                    :CONSUMO_FAMILIA_ID,  
                    :CONSUMO_LOCALIZACAO_ID,
                    'TBREMESSA_CONSUMO',
                    2,
                    :CONSUMO_ID,
                    NEW.ESTABELECIMENTO_CODIGO,
                    NEW.DATA_PRODUCAO,
                    :CONSUMO_PRODUTO_ID,
                    :CONSUMO_TAMANHO,
                    :CONSUMO_QUANTIDADE,
                    'S',
                    '1',
                    :UP_CCUSTO,
                    'WEB22180 - SAIDA POR CONSUMO DE REMESSA DE PRODUCAO. REMESSA: ' || REMESSA || ' TALAO: ' || FN_LPAD(NEW.REMESSA_ACUMULADO_CONTROLE,4,0),
                    :CONSUMO_ESTOQUE_ID,
                    NEW.REMESSA,
                    NEW.CONTROLE
                );
    
            END
    
    
    
        END
        ELSE
        /* CANCELANDO PRODUCAO */
        IF ( OLD.SITUACAO = 2 AND NEW.SITUACAO = 1 ) THEN
        BEGIN

            FN_OPERADOR_AUTENTICACAO(NEW.OPERADOR_ID_PRODUCAO,31); /* CANCELAR PRODUCAO */


            SELECT FIRST 1
                   T.ID,
                   T.GP_ID,
                   T.UP_ID,
                   T.ESTACAO
              FROM VWREMESSA_TALAO T
             WHERE T.REMESSA_ID = NEW.REMESSA
               AND T.REMESSA_TALAO_ID = NEW.REMESSA_ACUMULADO_CONTROLE
              INTO TALAO_ID,
                   TALAO_GP_ID,
                   TALAO_UP_ID,
                   TALAO_ESTACAO;

    
            SELECT ID,
                   STATUS
              FROM TBPROGRAMACAO P
             WHERE P.TABELA_ID = :TALAO_ID
               AND P.TIPO = 'A'
              INTO PROGRAMACAO_ID,
                   PROGRAMACAO_STATUS;


            IF ( PROGRAMACAO_STATUS <> 2 ) THEN
            BEGIN       
                UPDATE TBPROGRAMACAO P SET P.STATUS = 2 WHERE P.TIPO = 'A' AND P.TABELA_ID = :TALAO_ID;
    
                INSERT INTO TBPROGRAMACAO_REGISTRO (
                    PROGRAMACAO_ID,
                    STATUS,
                    OPERADOR_ID
                ) VALUES (
                   :PROGRAMACAO_ID,       
                   0,
                   NEW.OPERADOR_ID_PRODUCAO
                );
            END


            NEW.QUANTIDADE_PRODUCAO = 0;
            NEW.QUANTIDADE_SALDO = 0;
            NEW.HORA_PRODUCAO = NULL;
            NEW.DATA_PRODUCAO = NULL;


            FOR
                SELECT I.CONTROLE,
                       I.TABELA_ID,
                       I.QUANTIDADE
                  FROM TBESTOQUE_TRANSACAO_ITEM I
                 WHERE I.DOCUMENTO = NEW.REMESSA
                   AND I.REMESSA_ITEM_CONTROLE = NEW.CONTROLE
                   AND I.TABELA = 'TBREMESSA_CONSUMO'
                   AND I.TIPO = 'S'
                   AND I.TABELA_NIVEL = 2
            INTO
                CONSUMO_ESTOQUE_ID,
                CONSUMO_ID,
                CONSUMO_QUANTIDADE
            DO
            BEGIN
                UPDATE VWREMESSA_CONSUMO X
                   SET X.STATUS = '0',
                       X.ESTOQUE_ID = 0,
                       X.QUANTIDADE_CONSUMO = X.QUANTIDADE_CONSUMO - :CONSUMO_QUANTIDADE
                 WHERE X.ID = :CONSUMO_ID;

                 DELETE FROM TBESTOQUE_TRANSACAO_ITEM I WHERE I.CONTROLE = :CONSUMO_ESTOQUE_ID;

            END

        END
        ELSE
        IF ( OLD.SITUACAO = 3 AND NEW.SITUACAO = 1  ) THEN
        BEGIN
            EXCEPTION "..." 'TALAO JA COLETADO PARA A EXPEDICAO, OPERACAO NAO PERMITIDA.';
        END
        ELSE
        IF ( OLD.SITUACAO = 2 AND NEW.SITUACAO = 3 ) THEN
        BEGIN
            /* O TALAO ESTA SENDO COLETADO NA EXPEDICAO */
        END
        ELSE
        IF ( OLD.SITUACAO IS DISTINCT FROM NEW.SITUACAO  ) THEN
        BEGIN
            EXCEPTION "..." 'OPERACAO NAO DISPONIVEL PARA ESTE TALAO. ENTRE EM CONTATO COM SUPORTE TECNICO E INFORME A OPERACAO A SER REALIZADA.';
        END
    END

end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbrequisicao_b0iu_01 for tbrequisicao
active before insert or update position 0
AS
DECLARE VARIABLE ESTABELECIMENTO INTEGER;
DECLARE VARIABLE USUARIO_ID INTEGER;
DECLARE VARIABLE USUARIO_NOME VARCHAR(20);
DECLARE VARIABLE UM    VARCHAR(3);
DECLARE VARIABLE DESCR VARCHAR(100);
DECLARE VARIABLE FRAC  CHAR(1);
DECLARE VARIABLE FAMILIA_ID  INTEGER;
DECLARE VARIABLE FAM_USUARIO INTEGER;
BEGIN

   USUARIO_NOME = (Select MON$USER from mon$attachments where mon$attachment_id = current_connection);

   if (:Usuario_Nome <> 'SYSDBA' and :Usuario_Nome <> 'GC') Then
       Begin

       USUARIO_ID = Coalesce((Select First 1 U.Codigo From TbUsuario U Where U.USUARIO = :USUARIO_NOME and U.Status = '1'),0);

          if (:USUARIO_ID = 0) then
              BEGIN
                  Exception "..." 'USUÁRIO INATIVO OU NÃO LOCALIZADO: '||:USUARIO_NOME||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END

        Estabelecimento = Coalesce((Select First 1 E.Estabelecimento_Codigo From TbUsuario_Estabelecimento E Where E.Usuario_Codigo = :USUARIO_ID),0);

        For Select First 1 U.SIGLA, P.DESCRICAO, U.PODE_FRACIONAR, P.FAMILIA_CODIGO,
        Coalesce((Select First 1 F.Familia_Id From TbUsuario_Familia F Where F.Familia_Id = P.Familia_Codigo and F.Usuario_Id = :USUARIO_ID),0),
        IIF(:ESTABELECIMENTO>0,Coalesce((Select First 1 E.Estabelecimento_Codigo From TbUsuario_Estabelecimento E Where E.Usuario_Codigo = :USUARIO_ID and E.Estabelecimento_Codigo = New.Estabelecimento_Id),0),-1)
        From TbProduto P, TbUnidadeMedida U
        Where P.Codigo = New.PRODUTO_ID and P.Unidademedida_Sigla = U.Sigla
        Into :UM, :DESCR, :FRAC, :FAMILIA_ID, :FAM_USUARIO, :ESTABELECIMENTO
        Do
        Begin
          if (:ESTABELECIMENTO = 0) then
              BEGIN
                  Exception "..." 'USUÁRIO NÃO TEM PERMISSÃO DE REGISTRAR REQUISIÇÕES PARA O ESTABELECIMENTO INFORMADO: '||
                  :ESTABELECIMENTO||'-'||Coalesce((Select First 1 E.NomeFantasia From TbEstabelecimento E Where E.Codigo = New.Estabelecimento_Id),'')||' -> USUÁRIO: '||:USUARIO_ID||'-'||:Usuario_Nome||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
          if (:FAM_USUARIO = 0) then
              BEGIN
                  Exception "..." 'USUÁRIO NÃO TEM PERMISSÃO DE REGISTRAR REQUISIÇÕES PARA A FAMÍLIA DESTE PRODUTO: '||
                  :FAMILIA_ID||'-'||Coalesce((Select First 1 F.Descricao From TbFamilia F Where F.Codigo = :FAMILIA_ID),'')||' -> USUÁRIO: '||:USUARIO_ID||'-'||:Usuario_Nome||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
          if (:FRAC = 'N') then
              BEGIN
              if (NEW.QUANTIDADE > TRUNC(NEW.QUANTIDADE)) THEN
                  Exception "..." 'PRODUTO NÃO PERMITE QUANTIDADE FRACIONADA: '||
                  NEW.PRODUTO_ID||'-'||:DESCR||' QUANT.'||NEW.QUANTIDADE||' '||:UM||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
        --  NEW.USUARIO_ID = :USUARIO_ID;
        End
     End
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbrequisicao_oc_item_b3iu for tbrequisicao_oc_item
active before insert or update position 1
AS
declare variable UM varchar(10);
declare variable pode_fracionar char(1);
declare variable DESCRICAO VARCHAR(300);
begin
    if(new.PRODUTO_ID > 0) then
    begin
    FOR select first 1 coalesce(b.PODE_FRACIONAR,'N') AS PODE_FRACIONAR,
        coalesce(b.SIGLA,'') AS UM, A.DESCRICAO
        from tbproduto a, TbUnidadeMedida b where a.codigo = new.produto_id
        and a.UNIDADEMEDIDA_SIGLA = b.SIGLA INTO PODE_FRACIONAR, UM, DESCRICAO DO
         BEGIN

           if(pode_fracionar = 'N') then
              BEGIN
              if (NEW.QUANTIDADE > TRUNC(NEW.QUANTIDADE)) THEN
                  Exception "..." 'PRODUTO NAO PERMITE QUANTIDADE FRACIONADA: '||
                  NEW.produto_id||'-'||DESCRICAO||' QUANT.'||NEW.QUANTIDADE||' '||UM||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
       END
    end
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER trigger ttbsobra_b0iu_01 for tbsobra
active before insert or update position 0
AS
DECLARE VARIABLE ESTABELECIMENTO INTEGER;
DECLARE VARIABLE USUARIO_ID INTEGER;
DECLARE VARIABLE USUARIO_NOME VARCHAR(20);
DECLARE VARIABLE UM    VARCHAR(3);
DECLARE VARIABLE DESCR VARCHAR(100);
DECLARE VARIABLE FRAC  CHAR(1);
BEGIN

   USUARIO_NOME = (Select MON$USER from mon$attachments where mon$attachment_id = current_connection);

   if (:Usuario_Nome <> 'SYSDBA' and :Usuario_Nome <> 'GC') Then
       Begin

       USUARIO_ID = Coalesce((Select First 1 U.Codigo From TbUsuario U Where U.USUARIO = :USUARIO_NOME and U.Status = '1'),0);

          if (:USUARIO_ID = 0) then
              BEGIN
                  Exception "..." 'USUÁRIO INATIVO OU NÃO LOCALIZADO: '||:USUARIO_NOME||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END

        Estabelecimento = Coalesce((Select First 1 E.Estabelecimento_Codigo From TbUsuario_Estabelecimento E Where E.Usuario_Codigo = :USUARIO_ID),0);

        For Select First 1 U.SIGLA, P.DESCRICAO, U.PODE_FRACIONAR,
        IIF(:ESTABELECIMENTO>0,Coalesce((Select First 1 E.Estabelecimento_Codigo From TbUsuario_Estabelecimento E Where E.Usuario_Codigo = :USUARIO_ID and E.Estabelecimento_Codigo = New.Estabelecimento_Id),0),-1)
        From TbProduto P, TbUnidadeMedida U
        Where P.Codigo = New.Produto_Id and P.Unidademedida_Sigla = U.Sigla
        Into :UM, :DESCR, :FRAC, :ESTABELECIMENTO
        Do
        Begin
          if (:ESTABELECIMENTO = 0) then
              BEGIN
                  Exception "..." 'USUÁRIO NÃO TEM PERMISSÃO DE REGISTRAR SOBRAS DO ESTABELECIMENTO INFORMADO: '||
                  :ESTABELECIMENTO||'-'||Coalesce((Select First 1 E.NomeFantasia From TbEstabelecimento E Where E.Codigo = New.Estabelecimento_Id),'')||' -> USUÁRIO: '||:USUARIO_ID||'-'||:Usuario_Nome||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
          if (:FRAC = 'N') then
              BEGIN
              if (NEW.QUANTIDADE > TRUNC(NEW.QUANTIDADE)) THEN
                  Exception "..." 'PRODUTO NÃO PERMITE QUANTIDADE FRACIONADA: '||
                  NEW.PRODUTO_ID||'-'||:DESCR||' QUANT.'||NEW.QUANTIDADE||' '||:UM||
                  ' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ';
              END
        End
     End
END
^

SET TERM ; ^