DROP INDEX ITBDEFEITO_TRANSACAO_ITEM_10;

DROP VIEW VWREGISTRO_DEFEITO_DIA;

CREATE OR ALTER trigger ttbdefeito_transacao_item_b1i for tbdefeito_transacao_item
active before insert position 1
AS
declare variable vData Date;
Begin

end;

CREATE OR ALTER trigger ttbdefeito_transacao_item_b2u for tbdefeito_transacao_item
active before update position 1
AS
Begin

end;

CREATE OR ALTER trigger ttbdefeito_transacao_item_b3iu for tbdefeito_transacao_item
active before insert or update position 3
AS
DECLARE VARIABLE REGISTRAR_SEM_TALAO VARCHAR(10);
DECLARE VARIABLE ESTABELECIMENTO_ID INTEGER;
DECLARE VARIABLE PRODUTO_ID INTEGER;
DECLARE VARIABLE TAMANHO INTEGER;
DECLARE VARIABLE GP_ID INTEGER;
BEGIN

end;

ALTER TABLE TBDEFEITO_TRANSACAO_ITEM ADD OLD_PERFIL VARCHAR(10) DEFAULT '';
update TBDEFEITO_TRANSACAO_ITEM set OLD_PERFIL = PERFIL;
ALTER TABLE TBDEFEITO_TRANSACAO_ITEM DROP PERFIL;
ALTER TABLE TBDEFEITO_TRANSACAO_ITEM ADD PERFIL VARCHAR(10) DEFAULT '';
update TBDEFEITO_TRANSACAO_ITEM set PERFIL = OLD_PERFIL;
ALTER TABLE TBDEFEITO_TRANSACAO_ITEM DROP OLD_PERFIL;

CREATE INDEX ITBDEFEITO_TRANSACAO_ITEM_10 ON TBDEFEITO_TRANSACAO_ITEM (PERFIL);

CREATE OR ALTER trigger ttbdefeito_transacao_item_b3iu for tbdefeito_transacao_item
active before insert or update position 3
AS
DECLARE VARIABLE REGISTRAR_SEM_TALAO VARCHAR(10);
DECLARE VARIABLE ESTABELECIMENTO_ID INTEGER;
DECLARE VARIABLE PRODUTO_ID INTEGER;
DECLARE VARIABLE TAMANHO INTEGER;
DECLARE VARIABLE GP_ID INTEGER;
BEGIN

    REGISTRAR_SEM_TALAO = FN_PARAMETRO('TBUSUARIO.REG_DEF_SEM_TALAO',FN_CURRENT_USER_ID());

    IF ( REGISTRAR_SEM_TALAO = 0 ) THEN
    BEGIN
        IF ( COALESCE(NEW.REMESSA,0) = 0 OR COALESCE(NEW.REMESSA_CONTROLE,0) = 0 ) THEN
        BEGIN
            EXCEPTION "..." 'USUARIO NAO PERMITE REGISTRAR DEFEITO SEM REMESSA E TALAO.';
        END
    END

    IF ( NEW.REMESSA > 0 OR NEW.REMESSA_CONTROLE > 0 ) THEN
    BEGIN

        /* VERIFICA SE EH TALAO DETALHATADO */
        SELECT FIRST 1
               D.ESTABELECIMENTO_ID,
               D.PRODUTO_ID,
               D.TAMANHO,
               D.GP_ID
          FROM VWREMESSA_TALAO_DETALHE D
         WHERE D.REMESSA_ID = NEW.REMESSA
           AND D.ID         = NEW.REMESSA_CONTROLE
          INTO :ESTABELECIMENTO_ID,
               :PRODUTO_ID,
               :TAMANHO,
               :GP_ID;

         /* VERIFICA SE EH TALAO ACUMUADLO */
         IF ( PRODUTO_ID IS NULL ) THEN
         BEGIN
            SELECT FIRST 1
                   T.ESTABELECIMENTO_ID,
                   T.PRODUTO_ID,
                   T.TAMANHO,
                   T.GP_ID
              FROM VWREMESSA_TALAO T
             WHERE T.REMESSA_ID       = NEW.REMESSA
               AND T.REMESSA_TALAO_ID = NEW.REMESSA_CONTROLE
              INTO :ESTABELECIMENTO_ID,
                   :PRODUTO_ID,
                   :TAMANHO,
                   :GP_ID;
         END

         IF ( PRODUTO_ID IS NULL ) THEN
         BEGIN
            EXCEPTION "..." 'TALAO INEXISTENTE.';
         END


         IF ( NEW.ESTABELECIMENTO_ID <> ESTABELECIMENTO_ID ) THEN
         BEGIN
            EXCEPTION "..." 'ESTABELECIMENTO NAO CONFERE.';
         END         

         IF ( NEW.ESTEIRA_ID <> GP_ID ) THEN
         BEGIN
            EXCEPTION "..." 'GP NAO CONFERE. ESPERADO: ' || COALESCE(FN_LPAD(GP_ID,3,0),'') || ' - ' || COALESCE(FN_DESCRICAO('TBGP',GP_ID),'');
         END

         IF ( NEW.PRODUTO_ID <> PRODUTO_ID ) THEN
         BEGIN
            EXCEPTION "..." 'PRODUTO NAO CONFERE. ESPERADO: ' || COALESCE(FN_LPAD(PRODUTO_ID,4,0),'') || ' - ' || COALESCE(FN_DESCRICAO('TBPRODUTO',PRODUTO_ID),'');
         END
         IF ( NEW.TAMANHO <> TAMANHO ) THEN
         BEGIN
            EXCEPTION "..." 'TAMANHO NAO CONFERE. ESPERADO: ' || COALESCE(FN_TAMANHO_PRODUTO(PRODUTO_ID,TAMANHO),'');
         END

    END

END;

CREATE OR ALTER trigger ttbdefeito_transacao_item_b2u for tbdefeito_transacao_item
active before update position 1
AS
Begin

  if ((NEW.PRODUTO_ID <> OLD.PRODUTO_ID) or (NEW.TAMANHO <> OLD.TAMANHO) or (NEW.PERFIL IS NULL) or (Trim(NEW.PERFIL) = '')) Then
      Begin
      NEW.PERFIL = Coalesce((Select First 1 M.Perfil From TbProduto P, TbModelo_Bloqueio M
                              Where P.Codigo    = New.Produto_ID
                                and M.Modelo_Id = P.Modelo_Codigo
                                and M.Cor_Id    = P.Cor_Codigo
                                and M.Tamanho   = New.Tamanho),'');
      END

End;

CREATE OR ALTER trigger ttbdefeito_transacao_item_b1i for tbdefeito_transacao_item
active before insert position 1
AS
declare variable vData Date;
Begin

  vData = Coalesce((Select First 1 F.Data_Producao From TbFamilia F, TbProduto P
                          Where P.Codigo = New.Produto_ID
                            and F.Codigo = P.Familia_Codigo),Cast('01.01.1900' as Date));

  if (:vData <> '01.01.1900') then
      Begin
      if (:vData <> New.Data) then
          Exception "..." 'Data de produção para registro de defeito inválida, a data liberada é '||
                          Extract(Day from vData)||'/'||Extract(Month from vData)||'/'||Extract(Year from vData);
      End


  if ((Trim(NEW.PERFIL) = '') or (NEW.PERFIL IS NULL)) Then
      Begin
      NEW.PERFIL = Coalesce((Select First 1 M.Perfil From TbProduto P, TbModelo_Bloqueio M
                              Where P.Codigo    = New.Produto_ID
                                and M.Modelo_Id = P.Modelo_Codigo
                                and M.Cor_Id    = P.Cor_Codigo
                                and M.Tamanho   = New.Tamanho),'');
      END

End;

CREATE OR ALTER VIEW VWREGISTRO_DEFEITO_DIA(
    DATA_REGISTRO,
    DEFEITO,
    MODELO,
    PRODUTO,
    COR,
    GP,
    LINHA,
    PERFIL,
    QUANTIDADE,
    QTD_TURNO1,
    QTD_TURNO2,
    TALOES,
    DEFEITO_SETOR,
    DEFEITO_ID,
    MODELO_ID,
    PRODUTO_ID,
    COR_ID,
    GP_ID,
    LINHA_ID,
    PERFIL_ID,
    FAMILIA_ID,
    ESTABELECIMENTO_ID,
    TAMANHO,
    DENSIDADE,
    ESPESSURA)
AS
select

    DATA_REGISTRO,
    DEFEITO,
    MODELO,
    PRODUTO,
    COR,
    GP,
    LINHA,
    PERFIL,
    sum(Quantidade) as Quantidade,
    sum(QTD_TURNO1) as QTD_TURNO1,
    sum(QTD_TURNO2) as QTD_TURNO2,
    sum(TALOES) as TALOES,
    defeito_setor,
    defeito_id,
    MODELO_ID,
    PRODUTO_ID,
    COR_ID,
    GP_ID,
    LINHA_ID,
    PERFIL_ID,
    familia_id,
    estabelecimento_id,
    tamanho,
    cast(substring(Densidade from 1  for 10) as numeric(5,2)) DENSIDADE,
    cast(substring(Densidade from 11 for 20) as numeric(5,2)) espessura

from(
    Select
        
        B.Data DATA_REGISTRO,
        d.descricao as DEFEITO,
        d.setor as SETOR,
        m.descricao as MODELO,
        p.descricao as PRODUTO,
        c.descricao as COR,
        e.descricao as GP,
        r.descricao as LINHA,
        s.descricao as PERFIL,
    
        B.Quantidade,
        IIF(B.TURNO=1,B.Quantidade,0) QTD_TURNO1,
        IIF(B.TURNO=2,B.Quantidade,0) QTD_TURNO2,
        1 as TALOES,
    
        d.setor  as defeito_setor,
        d.codigo as defeito_id,
        m.codigo as modelo_id,
        p.codigo as produto_id,
        c.codigo cor_id,
        e.codigo gp_id,
        r.codigo linha_id,
        s.id perfil_id,

        p.familia_codigo as familia_id,
        b.estabelecimento_id,

        FN_TAMANHO_GRADE(p.grade_codigo, b.tamanho) tamanho,

        (Select First 1
      Coalesce((Select First 1 lpad(M.Densidade,10,0)||lpad(m.espessura,10,0)
         From TbModelo M Where M.Codigo = P2.Modelo_Codigo),'0000000000')
      From TbModelo_Consumo_Cor MC, TbFamilia F, TbProduto P2
     Where MC.Modelo_Id = p.modelo_codigo
       and MC.Cor_Id = c.codigo
       and MC.Produto_Id = P2.Codigo
       and P2.Familia_Codigo = F.Codigo
       and F.Densidade_Espessura = '1'

       and((b.tamanho = 1 and MC.T01 > 0) or
           (b.Tamanho = 2 and MC.T02 > 0) or
           (b.Tamanho = 3 and MC.T03 > 0) or
           (b.Tamanho = 4 and MC.T04 > 0) or
           (b.Tamanho = 5 and MC.T05 > 0) or
           (b.Tamanho = 6 and MC.T06 > 0) or
           (b.Tamanho = 7 and MC.T07 > 0) or
           (b.Tamanho = 8 and MC.T08 > 0) or
           (b.Tamanho = 9 and MC.T09 > 0) or
           (b.Tamanho =10 and MC.T10 > 0) or
           (b.Tamanho =11 and MC.T11 > 0) or
           (b.Tamanho =12 and MC.T12 > 0) or
           (b.Tamanho =13 and MC.T13 > 0) or
           (b.Tamanho =14 and MC.T14 > 0) or
           (b.Tamanho =15 and MC.T15 > 0) or
           (b.Tamanho =16 and MC.T16 > 0) or
           (b.Tamanho =17 and MC.T17 > 0) or
           (b.Tamanho =18 and MC.T18 > 0) or
           (b.Tamanho =19 and MC.T19 > 0) or
           (b.Tamanho =20 and MC.T20 > 0))) as Densidade
    
    From TbDefeito_Transacao_Item B,tbsac_defeito d, TbEsteira E, TbProduto P, tbmodelo M, tbcor c,tbmodelo_linha r,tbperfil s
    Where B.Esteira_id = E.Codigo
      and B.Produto_id = P.Codigo
      --and B.Estabelecimento_Id = :ESTABELECIMENTO
      --and B.Data between :DATA1 and :DATA2
      AND (B.DEFEITO_ID > 0)
      --and P.Familia_Codigo = :FAMILIA
      and m.codigo = p.modelo_codigo
      and d.codigo = b.defeito_id
      and c.codigo = p.cor_codigo
      and r.codigo = m.linha_codigo
      and s.id = b.perfil
      and s.tabela = 'SKU'
      and s.familia_id = p.familia_codigo

)

        group by
        DATA_REGISTRO,
        DEFEITO,
        MODELO,
        PRODUTO,
        COR,
        GP,
        LINHA,
        PERFIL,
        defeito_setor,
        defeito_id,
        MODELO_ID,
        PRODUTO_ID,
        COR_ID,
        GP_ID,
        LINHA_ID,
        PERFIL_ID,
        familia_id,
        estabelecimento_id,
        tamanho,
        Densidade,
        espessura
;

