CREATE TABLE TBTEMP_AJUSTE (
    AGRUPAMENTO_ID  INTEGER NOT NULL,
    PERFIL          CHAR(1) NOT NULL,
    ID              INTEGER NOT NULL,
    CAP_PRODUTIVA   NUMERIC(15,4) DEFAULT 0,
    QUANTIDADE      NUMERIC(15,4) DEFAULT 0,
    SALDO           NUMERIC(15,4) DEFAULT 0,
    CAP_MINUTO      NUMERIC(15,4) DEFAULT 0,
    FLAG            SMALLINT DEFAULT 0
);

insert into TBTEMP_AJUSTE
select
    AGRUPAMENTO_ID,
    PERFIL,
    ID,
    CAP_PRODUTIVA,
    QUANTIDADE,
    SALDO,
    CAP_MINUTO,
    FLAG
from  TBAGRUPAMENTO_CARGA_COR;

DROP TRIGGER TTBAGRUP_CARGA_COR_B0U_01;
DROP TRIGGER TTBAGRUP_CARGA_COR_B0I;

CREATE OR ALTER trigger ttbagrup_carga_sku_cor_b1d_01 for tbagrupamento_carga_sku_cor
active before delete position 1
AS
begin

End;

CREATE OR ALTER trigger ttbagrup_carga_sku_cor_b1i_01 for tbagrupamento_carga_sku_cor
active before insert position 1
AS
Begin

End;

CREATE OR ALTER trigger ttbagrup_carga_sku_cor_b1u_01 for tbagrupamento_carga_sku_cor
active before update position 1
AS
declare variable vPerfil Char(1);
declare variable vMinutos integer;
declare variable vAgrup_Cor_id  integer;
Begin

End;

DROP TABLE TBAGRUPAMENTO_CARGA_COR;

CREATE TABLE TBAGRUPAMENTO_CARGA_COR (
    AGRUPAMENTO_ID  INTEGER NOT NULL,
    PERFIL          varchar(10) NOT NULL,
    ID              INTEGER NOT NULL,
    CAP_PRODUTIVA   NUMERIC(15,4) DEFAULT 0,
    QUANTIDADE      NUMERIC(15,4) DEFAULT 0,
    SALDO           NUMERIC(15,4) DEFAULT 0,
    CAP_MINUTO      NUMERIC(15,4) DEFAULT 0,
    FLAG            SMALLINT DEFAULT 0
);

ALTER TABLE TBAGRUPAMENTO_CARGA_COR ADD PRIMARY KEY (AGRUPAMENTO_ID, PERFIL, ID);

insert into TBAGRUPAMENTO_CARGA_COR
select
    AGRUPAMENTO_ID,
    PERFIL,
    ID,
    CAP_PRODUTIVA,
    QUANTIDADE,
    SALDO,
    CAP_MINUTO,
    FLAG
from  TBTEMP_AJUSTE;

DROP TABLE TBTEMP_AJUSTE;

CREATE OR ALTER TRIGGER TTBAGRUP_CARGA_COR_B0I FOR TBAGRUPAMENTO_CARGA_COR
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbagrupamento_carga_cor,1);
end;

CREATE OR ALTER TRIGGER TTBAGRUP_CARGA_COR_B0U_01 FOR TBAGRUPAMENTO_CARGA_COR
ACTIVE BEFORE UPDATE POSITION 0
as
begin
  if (new.Saldo <> Old.Saldo and Old.Flag >= New.Flag) then
      Begin
      if (New.Saldo < 0 and new.Saldo < Old.Saldo) Then
          Begin
          Exception "..." 'Não há saldo disponível.'||Cast(Old.Saldo as VarChar(20))||' -> '||Cast(New.Saldo as VarChar(20));
          End
      End
end;

CREATE OR ALTER trigger ttbagrup_carga_sku_cor_b1d_01 for tbagrupamento_carga_sku_cor
active before delete position 1
AS
begin

    UPDATE tbagrupamento_carga_cor set
    Quantidade = Quantidade - OLD.Quantidade,
    Saldo = Saldo + OLD.Necessidade
      Where AGRUPAMENTO_ID = OLD.Agrupamento_Id
        and ID = OLD.Agrup_cor_Id;

End;

CREATE OR ALTER trigger ttbagrup_carga_sku_cor_b1i_01 for tbagrupamento_carga_sku_cor
active before insert position 1
AS
Begin

  UPDATE tbagrupamento_carga_cor set
  Quantidade = Quantidade + NEW.Quantidade,
  Saldo = Saldo - NEW.Necessidade
  Where AGRUPAMENTO_ID = New.Agrupamento_Id
    and ID = New.Agrup_cor_Id;

End;

CREATE OR ALTER trigger ttbagrup_carga_sku_cor_b1u_01 for tbagrupamento_carga_sku_cor
active before update position 1
AS
declare variable vPerfil Char(1);
declare variable vMinutos integer;
declare variable vAgrup_Cor_id  integer;
Begin
  if (NEW.Agrupamento_Id = OLD.Agrupamento_Id) then
      Begin
          if (NEW.Quantidade < OLD.Quantidade) then
              Begin
               UPDATE tbagrupamento_carga_cor set
               Quantidade = Quantidade - Abs(Old.Quantidade - New.Quantidade),
               Saldo = Saldo + Abs(New.Necessidade - Old.Necessidade)
               Where AGRUPAMENTO_ID = New.Agrupamento_Id
                 and ID = New.Agrup_cor_Id;
              End else
          if (NEW.Quantidade > OLD.Quantidade) then
              Begin
               UPDATE tbagrupamento_carga_cor set
               Quantidade = Quantidade + Abs(New.Quantidade - Old.Quantidade),
               Saldo = Saldo - Abs(New.Necessidade - Old.Necessidade)
               Where AGRUPAMENTO_ID = New.Agrupamento_Id
                 and ID = New.Agrup_Cor_Id;
              End
      End else
  if (NEW.Agrupamento_Id <> OLD.Agrupamento_Id) then
      Begin

      vPerfil = Coalesce((Select First 1 F1.Perfil
                            From TBAGRUPAMENTO_CARGA_COR F1
                           Where F1.agrupamento_id = Old.Agrupamento_Id
                             and F1.id = Old.Agrup_Cor_Id),0);

       For
       Select First 1 A.minutos_produtivos, Coalesce(F2.ID,0) as Agrup_Cor_id from TbAgrupamento A
         Left Join TBAGRUPAMENTO_CARGA_COR F2 ON F2.agrupamento_id = A.ID and f2.Perfil = :vPerfil
        Where A.ID = New.Agrupamento_Id
        Into :vMinutos, :vAgrup_Cor_id
        Do Begin
           if (:vAgrup_Cor_id = 0) then
               Begin
               vAgrup_Cor_id = gen_id(gtbagrupamento_carga_cor,1);
               Insert into TBAGRUPAMENTO_CARGA_COR
               (AGRUPAMENTO_ID,PERFIL,ID,CAP_PRODUTIVA,QUANTIDADE,SALDO)
                values (New.Agrupamento_Id,:vPerfil,:vAgrup_Cor_id,:vMinutos,0,:vMinutos);
               End
           End

       UPDATE tbagrupamento_carga_cor set
       Quantidade = Quantidade - Old.Quantidade,
       Saldo = Saldo + Old.Necessidade
       Where AGRUPAMENTO_ID = Old.Agrupamento_Id
         and ID = Old.Agrup_Cor_Id;

       UPDATE tbagrupamento_carga_cor set
       Quantidade = Quantidade + New.Quantidade,
       Saldo = Saldo - New.Necessidade
       Where AGRUPAMENTO_ID = New.Agrupamento_Id
         and ID = :vAgrup_Cor_Id;

       New.Agrup_Cor_Id = :vAgrup_Cor_Id;
      End
End;

GRANT ALL ON TBAGRUPAMENTO_CARGA_COR TO RDB$ADMIN;
